在ISO / IEC 9899:2018(C18)中,声明了6.2.3“标识符的名称空间”(强调我的名称:]:
6.2.3标识符的名称空间
1如果在翻译单元中的任何位置都可以看到一个以上的特定标识符声明,则语法上下文会消除指向不同实体的用法的歧义。因此,对于各种类别的标识符,存在单独的名称空间,如下所示:
...
关键字struct,union,orenum的结构,联合和枚举的标签(通过遵循any32消除歧义);
32)标签的只有一个名称空间即使可能是三个。
作为实验,我试图编译以下代码:
#include <stdio.h>
int main()
{
struct foo{
int a;
double b;
float c;
};
enum foo{
Test1,Test2,Test3
};
union foo{
int x;
double y;
float z;
};
return 0;
}
我有以下错误:
错误:“ foo”被定义为错误的标签类型
对于enum
和union
定义,就像您看到的here一样,这证明为定义在以下位置的所有struct
,enum
和union
标签仅提供了一个名称空间范围相同,就像描述的标准一样。
我的问题是:
该标准没有说结构,联合和枚举存在单独的名称空间。它说从理论上讲三种是可能的,这意味着该语言可以设计成每个都有单独的名称空间。
该语言本可以设计为具有单独的名称空间,因为标签仅在关键字struct
,union
或enum
之后出现,因此编译器将始终知道需要哪个名称空间。
尽管如此,C开发人员和C委员会决定不在语言设计中使用它。该标准的含义是存在一个名称空间,其中包含结构,联合和枚举的所有标记。