C形式定义中的命名空间

时间:2018-11-23 07:02:30

标签: c namespaces language-lawyer

我正在阅读N1570标准,但在理解 名称空间 定义的措词时遇到了问题。就是这样:

  

1如果一个特定标识符的多个声明可见   在翻译单元的任何时候,句法语境   消除了指向不同实体的使用的歧义。因此,有   用于各种类别标识符的单独名称空间,例如   如下:

     

-标签名称(由标签的语法消除)   声明和使用);

     

-结构,并集和   关键字的枚举(通过跟随任何 32消除歧义)   struct,union或enum);

     

-结构或联合会的成员;每   结构或联合为其成员具有单独的名称空间   (由用于访问成员的表达式类型消除歧义   通过.->运算符);

     

-所有其他标识符,称为普通标识符   标识符(在普通声明符中声明或作为枚举声明   常数)。

     

32)尽管只有三个名称空间,但标签只有一个名称空间。

在这里,他们要讨论的是特定标识符的声明超过1个的情况。现在,诸如“访问标识符应指定其名称空间”或“访问特定命名空间中的标识符...”之类的字眼。

1 个答案:

答案 0 :(得分:7)

让我先展示一个示例(出于理解目的,严格来说是 ,不要这样写代码, ever

#include  <stdio.h>


int main(void)
{
    int here = 0;    //.......................ordinary identifier
    struct here {    //.......................structure tag
        int here;    //.......................member of a structure
    } there;

here:                             //......... a label name
     here++;
     printf("Inside here\n");
     there.here = here;           //...........no conflict, both are in separate namespace
     if (here > 2) {
         return 0; 
     }
     else
       goto here;                 //......... a label name

    printf("Hello, world!\n");          // control does not reach here..intentionally :)
    return 0;
}

您会看到标识符here的用法。它们根据规则属于单独的命名空间,因此此程序很好。

但是,例如,您将结构变量名称从there更改为here,您会看到一个冲突,因为那时将有两个单独的具有相同标识符的声明(普通标识符)在同一名称空间中。