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