typedef具有前向声明副作用?

时间:2012-07-08 13:15:07

标签: c typedef forward-declaration

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

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

如果没有前向声明,编译器显然会给this error

  

error: 'struct my_struct' declared inside parameter list

但是,如果我用typedef替换my_struct的前向声明,并相应地更新函数声明,那么compiles fine

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

奇怪的是,如果我保留typedef,但使用原始声明my_struct,那么also compiles

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

有没有人注意到这一点?这种行为是副作用吗?

1 个答案:

答案 0 :(得分:7)

在第6.2.1节第7段中:

  

结构,联合和枚举标记的范围在外观之后开始   声明标签的类型指定器中的标签。每个枚举常量都具有该范围   在枚举器列表中出现其定义枚举器之后开始。任何   其他标识符的范围在其声明者完成之后开始。

在6.7.2.3第8段中:

  

如果是表格的类型说明   结构或联合标识符   除了作为上述形式之一的一部分之外发生,并且没有其他声明   识别标签是可见的,然后它声明一个不完整的结构或联合类型,和   将标识符声明为该类型的标记。

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