例如,以下是有效的C代码吗?
typedef struct {
/* ... */
} foo;
typedef struct {
foo foo; /* Is it ok that 'foo' == 'foo'? */
} bar;
答案 0 :(得分:6)
是的,这是有效的C(虽然它不可读,应该避免)。
类型标识符和结构成员标识符位于不同的名称空间中。
见C99,6.2.3p1标识符的名称空间:
[...]各种类别的标识符都有单独的名称空间,如下所示: - 标签名称(通过标签声明和使用的语法消除歧义);
- 结构,联合和枚举的标签[...]
- 结构或工会的成员;每个结构或联合都有一个单独的名称 其成员的空间[...]
- 所有其他标识符,称为普通标识符[...]