typedef具有前向声明副作用?

Eit*_*n T 8 c typedef forward-declaration

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

struct my_struct;
int func(struct my_struct* s);        // Passing struct my_struct*
Run Code Online (Sandbox Code Playgroud)

如果没有前向声明,编译器显然会出现此错误:

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*
Run Code Online (Sandbox Code Playgroud)

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

typedef struct my_struct my_struct_t;
int func(struct my_struct* s);        // Passing struct my_struct*
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*her 7

在第6.2.1节第7段中:

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

在6.7.2.3第8段中:

如果形式为struct-or-union标识符的类型指定符不是作为上述表单之一的一部分而发生,并且没有其他标识符作为标记声明可见,则它声明一个不完整的结构或联合类型,并声明标识符作为该类型的标记.

typedef这样声明了一个不完整的结构类型.