在这里,我发现了一个看起来像这样的变量定义:
struct sockaddr *ai_addr;
Run Code Online (Sandbox Code Playgroud)
它似乎是定义一个指向类型变量的指针struct sockaddr
,但是
1)struct是一个关键字
2)struct sockaddr test;
产生错误
aggregate 'sockaddr test' has incomplete type and cannot be defined
Run Code Online (Sandbox Code Playgroud)
(我在gcc 4.7.1下工作)
在这个声明中
struct sockaddr *ai_addr;
Run Code Online (Sandbox Code Playgroud)
使用了所谓的精心设计的说明符.这个陈述做了两件事.首先,它声明了类型名称sockaddr
并声明了这种类型的指针.
要声明指向结构的指针,不需要定义结构,因为指针的大小不依赖于结构的大小.
对于这个声明
struct sockaddr ai_addr;
Run Code Online (Sandbox Code Playgroud)
编译器发出错误,因为它需要为类型的对象分配内存,struct sockaddr
但它不知道结构的大小,因为结构尚未定义.那是结构是不完整的类型.它只是声明但尚未定义,其大小未知.