我在头文件中有以下声明:
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*
有没有人注意到这一点?这种行为是副作用吗?
答案 0 :(得分:7)
在第6.2.1节第7段中:
结构,联合和枚举标记的范围在外观之后开始 声明标签的类型指定器中的标签。每个枚举常量都具有该范围 在枚举器列表中出现其定义枚举器之后开始。任何 其他标识符的范围在其声明者完成之后开始。
在6.7.2.3第8段中:
如果是表格的类型说明 结构或联合标识符 除了作为上述形式之一的一部分之外发生,并且没有其他声明 识别标签是可见的,然后它声明一个不完整的结构或联合类型,和 将标识符声明为该类型的标记。
typedef
因此声明了一个不完整的结构类型。