ISO/IEC 9899:2011 条款6.2.3——标识符的名字空间

6.2.3 标识符的名字空间


1、如果一个特定标识符的多个声明在一个翻译单元的任意一点可见,那么语法上下文会区分对不同实体的引用。从而,对于标识符各种不同的类别具有独立的名字空间:

——标签名(通过标签声明和使用的语法进行区分);

——结构体、联合体以及枚举的类型名(通过关键字structunionenum进行区分);

——结构体或联合体的成员;每个结构体或联合体为其成员具有一个独立的名字空间(通过用于访问成员的.或是->操作符的表达式类型进行区分);

——所有其它标识符称为普通标识符(声明在普通声明符中或是作为枚举常量)。

[译者注:比如:

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函数语句块中,对象标识符与结构体、联合体和枚举的标签名是完全可以相同的。另外,跳转标签也可以与普通对象标识符相同。

posted @ 2015-07-09 22:27  zenny_chen  Views(393)  Comments(0Edit  收藏  举报