![]() |
1
6
您所采用的C99标准的部分是6.7.2.3,第7段:
…和6.2.5第22段:
|
![]() |
2
7
正如第二个案例中的警告所说,
不完整的类型可以在C语言中提供一些类型封装。 中的相应段落 http://www.ibm.com/developerworks/library/pa-ctypes1/ 似乎是个很好的解释。 |
![]() |
3
2
第1和第2种情况定义得很好,因为指针的大小和对齐方式是已知的。C编译器只需要大小和对齐信息来定义结构。 第三个大小写无效,因为该实际结构的大小未知。 但是要注意,要使第一个案例符合逻辑,您需要为结构命名:
否则,外部结构和
第二个案例有一个流行的用例,叫做 "opaque pointer" (pimpl) . 例如,可以将包装结构定义为
在标题中,然后在其中一个
优势就在于此
|
![]() |
4
1
你必须说出它的名字。在这方面:
将无法指向自身
您将得到一个关于不兼容类型的错误。 |
![]() |
5
1
好。。。我只能说你先前的假设是错误的。每次使用
这种行为的更有趣的例子是当声明出现在函数原型中时:
在这种情况下,新的
尝试传递一个指针
这也立即意味着在以下声明中
每个
但是如果你预先申报
全部的
|
![]() |
6
0
我也在想这个。结果发现
在这里
|
![]() |
7
0
当声明结构类型的变量或字段时,编译器必须分配足够的字节来保存该结构。由于结构可能需要一个字节,或者可能需要数千个字节,所以编译器无法知道需要分配多少空间。有些语言使用多遍编译器,它可以在一次传递中找出结构的大小,并在以后的传递中为其分配空间;但是,由于C被设计为允许单遍编译,所以这是不可能的。因此,C禁止声明不完整结构类型的变量或字段。 另一方面,当声明指向结构类型的指针的变量或字段时,编译器必须分配足够的字节来保存指向结构的指针。 不管结构是占用一个字节还是一百万个字节,指针总是需要相同的空间量。 实际上,编译器可以将指向不完整类型的指针作为void*进行遍历,直到获得有关其类型的更多信息,然后在发现有关类型的更多信息后将其视为指向适当类型的指针。不完整的类型指针与void*不太相似,因为可以用void*做一些不完整类型不能做的事情(例如,如果p1是指向结构s1的指针,而p2是指向结构s2的指针,则不能将p1赋给p2),但不能用指向不完整类型的指针做任何事情,而不能用指向void*的指针。基本上,从编译器的角度来看,指向不完整类型的指针是指针大小的字节块。它可以复制到或从其他类似的指针大小的字节块复制,但就是这样。编译器可以生成这样做的代码,而不必知道对于指针大小的字节块还有什么其他用途。 |
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 7 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 8 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 8 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 8 月前 |