今天看代码,发现一个结构体,但是找不到定义,但是程序还是可以正常编译,这是为什么呢?
编译错误
尝试编译如下代码
#include <stdio.h>
struct ss;
int main()
{
int i = sizeof(struct ss);
printf("%d\n", i);
return 0;
}
结果可想而知,会有编译错误,说struct ss
是incomplete
的,即不完整的。
这很容易理解,因为struct ss
只有声明,没有定义。
main.c:6:10: error: invalid application of 'sizeof' to an incomplete type 'struct ss'
编译没错误
尝试编译如下代码
#include <stdio.h>
struct ss;
int main()
{
int i = 1234;
struct ss *s = (struct ss *)&i;
printf("%d\n", *(int *)s);
return 0;
}
输出
没错,不仅可以编过,而且运行正常。
1234
类型为什么需要complete?
要想知道为什么是以上现象,得搞明白类型对于程序有什么意义。
程序的类型最关键的就是size
,编译器要求类型定义完整,就是要知道如何把这个类型的数据放到内存中。编译器必须知道,应该分配多大空间放它?先放什么后放什么?
这就可以解释为什么第一段程序会编译错误,因为类型没有定义,编译器没法知道它有多大。
第二段程序为什么没有错误,原因也很明显了,因为编译器不需要知道它的大小。请注意struct ss *s
只是个指针,所以编译器只需要知道struct ss
的指针大小,而不需要知道struct ss
的大小,所以编译器没有困惑,程序也可以运行。
这下真相大白了,我看的代码也只是用了不完整类型的指针,既没有用sizeof,也没有访问其成员,估计那个结构体的意义也就是名字有意义了,新技巧get!