struct标签,union标签和enum标签是否有单独的命名空间?

时间:2017-11-17 10:17:18

标签: c namespaces name-lookup

schot's answer是个好人。他声称

  
      
  • 标签(结构,联合和枚举的名称)。
  •   

我认为结构,联合和枚举的标签有不同的名称空间,所以这段代码完全正常:

// In the same scope
struct T {};
union T {};
enum T {};

但从上面的引文推断,看起来所有标签共享相同的命名空间。答案不够清楚,还是我错了?

3 个答案:

答案 0 :(得分:4)

没有

所有标签共享相同的命名空间。所以你不被允许:

struct T {...};
union T {...};
enum T {...};

C11 draft N1570, 6.2.3 Name spaces of identifiers明确添加了脚注。

  

32)标签只有一个名称空间,即使有三个可能。

答案 1 :(得分:1)

不,他们没有单独的命名空间。标签只有一个命名空间。这意味着

struct TS{};
union TU{};
int TS, TU;

是有效的

struct T{};
union T{}; 

不是。 T的两个声明位于同一名称空间中。

答案 2 :(得分:1)

你的问题的答案:

标记名称:声明为structsunions和枚举类型名称的所有标识符。请注意,所有三种标记共享一个名称空间。

只需引用reference guide

  

在查找时,标识符的名称空间由其使用方式决定:

     
      
  • 标记名称空间中会查找关键字structunionenum后面的标识符。
  •