未声明的结构不会引起警告

Undeclared struct causes no warnings

本文关键字:警告 结构 未声明      更新时间:2023-10-16

下面的代码在gcc上可以正常编译,没有任何警告。

注意,该结构体没有前向声明。这是有效的C和/或c++代码?

struct Foobar* f;
struct Foobar* fun() { return 0; }
int main() { f = 0; fun(); return 0; }

这是一个不透明的结构,不是错误。因为在C语言中,所有的struct指针都是一样大的,所以不需要知道这个struct有哪些字段,只要对指向它的指针进行操作就可以了。

尝试定义一个变量结构Foobar(没有指针),你会得到一个不完整的类型错误。

这使您能够拥有带有私有字段的类型,例如来自stdio.h的FILE类型。

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;)的指针。