schot的答案很好。他声称
- 标记(结构、联合和枚举的名称(。
我认为结构、联合和枚举的标签有不同的命名空间,因此这段代码完全没问题:
// In the same scope
struct T {};
union T {};
enum T {};
但从上面的引文推断,看起来所有标签都共享同一个命名空间。是答案不够清楚还是我错了?
No.
所有标记共享相同的命名空间。因此,您不得拥有:
struct T {...};
union T {...};
enum T {...};
C11草案N1570,6.2.3标识符的命名空间明确添加了s脚注。
32( 标签只有一个命名空间,即使可能有三个。
不,它们没有单独的命名空间。标签只有一个命名空间。这意味着
struct TS{};
union TU{};
int TS, TU;
有效,而
struct T{};
union T{};
莫。两个T
声明位于同一命名空间中。
您的问题的答案:
标记名称:声明为structs
、unions
和枚举类型名称的所有标识符。请注意,所有三种类型的标记共享一个命名空间。
只是从参考指南中引用这一点。
在查找时,标识符的名称空间由其使用方式确定:
- 关键字
struct
、union
或enum
后面的标识符在标记命名空间中查找。