未声明的结构不会导致警告

时间:2015-09-08 14:54:26

标签: c++ c

以下代码在gcc上没有任何警告的情况下编译正常。

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

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

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

2 个答案:

答案 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;)或typedeftypedef struct Foobar Foobar;)的指针。