8

我在头文件中有以下声明:

struct my_struct;
int func(struct my_struct* s);        // Passing struct my_struct*

如果没有前向声明,编译器显然会给出这个错误

error: 'struct my_struct' declared inside parameter list

但是,如果我用my_structtypedef 替换前向声明,并相应地更新函数声明,它编译得很好

typedef struct my_struct my_struct_t;
int func(mystruct_t* s);              // Passing my_struct_t*

奇怪的是,如果我保留 typedef,但使用原始声明my_struct,它也会编译

typedef struct my_struct my_struct_t;
int func(struct my_struct* s);        // Passing struct my_struct*

其他人注意到了吗?这种行为是副作用吗?

4

1 回答 1

7

在第 6.2.1 节第 7 段中:

结构、联合和枚举标记的作用域在标记出现在声明标记的类型说明符之后开始。每个枚举常量的作用域都在其定义的枚举数出现在枚举数列表中之后开始。任何其他标识符的范围都在其声明符完成后开始。

在 6.7.2.3 第 8 段中:

如果 struct-or-union 标识符形式的类型说明符不是作为上述形式之一的一部分出现,并且没有其他标识符作为标记的声明是可见的,则它声明一个不完整的结构或联合类型,并声明标识符作为该类型的标记。

因此typedef声明了一个不完整的结构类型。

于 2012-07-08T13:34:10.090 回答