我正在阅读N1570标准,但在理解 名称空间 定义的措词时遇到了问题。就是这样:
1如果一个特定标识符的多个声明可见 在翻译单元的任何时候,句法语境 消除了指向不同实体的使用的歧义。因此,有 用于各种类别标识符的单独名称空间,例如 如下:
-标签名称(由标签的语法消除) 声明和使用);
-结构,并集和 关键字的枚举(通过跟随任何 32消除歧义) struct,union或enum);
-结构或联合会的成员;每 结构或联合为其成员具有单独的名称空间 (由用于访问成员的表达式类型消除歧义 通过
.
或->
运算符);-所有其他标识符,称为普通标识符 标识符(在普通声明符中声明或作为枚举声明 常数)。
32)尽管只有三个名称空间,但标签只有一个名称空间。
在这里,他们要讨论的是特定标识符的声明超过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
,您会看到一个冲突,因为那时将有两个单独的具有相同标识符的声明(普通标识符)在同一名称空间中。