以下代码编译正常,没有任何gcc警告.
请注意,结构没有前向声明.这是有效的C和/或C++代码吗?
struct Foobar* f;
struct Foobar* fun() { return 0; }
int main() { f = 0; fun(); return 0; }
Run Code Online (Sandbox Code Playgroud)
jfo*_*erg 26
这称为不透明结构,不是错误.由于所有结构指针在C中都同样大,所以只要你操作指向它的指针就没有必要知道结构有哪些字段.
尝试定义一个变量struct Foobar(没有指针),你会得到一个不完整的类型错误.
这使您可以拥有包含私有字段的类型,例如stdio.h中的FILE类型.
oua*_*uah 11
在C中有效
struct Foobar* f;
Run Code Online (Sandbox Code Playgroud)
是相同的:
struct Foobar;
struct Foobar* f;
Run Code Online (Sandbox Code Playgroud)
在C中,它声明了一个不完整的类型 struct Foobar
,它声明了一个指向不完整类型的指针对象.
该类型可以在另一个翻译单元中完成.(在C中有3种类型:对象,功能和不完整).
您不能创建不完整类型的对象或获取类型的大小:
struct Foobar x; // not valid
sizeof (struct Foobar); // not valid
Run Code Online (Sandbox Code Playgroud)
但是你可以创建指向不完整类型(struct Foobar* g;
)或typedef
(typedef struct Foobar Foobar;
)的指针.