ISO/IEC 9899:2011 条款6.2.3——标识符的名字空间
6.2.3 标识符的名字空间
1、如果一个特定标识符的多个声明在一个翻译单元的任意一点可见,那么语法上下文会区分对不同实体的引用。从而,对于标识符各种不同的类别具有独立的名字空间:
——标签名(通过标签声明和使用的语法进行区分);
——结构体、联合体以及枚举的类型名(通过关键字struct、union或enum进行区分);
——结构体或联合体的成员;每个结构体或联合体为其成员具有一个独立的名字空间(通过用于访问成员的.或是->操作符的表达式类型进行区分);
——所有其它标识符称为普通标识符(声明在普通声明符中或是作为枚举常量)。
[译者注:比如:
struct label { int label; struct { int label; }lab; }; union Label { int label; }; enum LABEL { LABEL1, LABEL2, LABEL3 }; static void FuncTest(void) { int label = 0; int Label = 1; int LABEL = 2; if(label > 0) goto label; // goto后面跟的是标签,因此能与变量label做出区分 struct label lab; lab.label = label; lab.lab.label = 10; union Label lab2 = { Label }; enum LABEL lab3 = LABEL3; if(lab3 == LABEL) puts("OK!"); printf("The answer is: %d\n", lab.label + lab2.label + lab3); label: puts("Complete!"); }
]
在以上代码中,在Apple LLVM 6.1编译器下,在外部定义的结构体、联合与枚举的标签名不能相同。而在FuncTest函数语句块中,对象标识符与结构体、联合体和枚举的标签名是完全可以相同的。另外,跳转标签也可以与普通对象标识符相同。