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

Kar*_*ath 14 c c++

以下代码编译正常,没有任何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类型.

  • 不必要.*定义*struct foobar`类型的变量,你会得到一个错误.仅仅声明一个变量而不定义它(`extern struct Foobar hello;`)不会给出任何错误. (4认同)

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