来自cppreference:
1)标签名称空间:所有声明为标签的标识符。
2)标记名称:声明为结构,联合和枚举类型名称的所有标识符。
3)成员名称:声明为任一结构或联合的成员的所有标识符。每个结构和联合都会引入自己的这种名称空间。
4)所有其他标识符,称为与(1-3)区别的普通标识符(函数名称,对象名称,typedef名称,枚举常量)。
这允许类似这样的代码:
struct Point { int x, y; };
struct Point Point;
对于我来说,这段代码似乎有些不清楚,因为Point可以同时引用结构的类型和实例。为标签和其他标识符使用单独的名称空间的背后动机是什么?
答案 0 :(得分:1)
提出的实际问题是
为标签和其他标识符使用单独的名称空间的背后动机是什么?
这只能通过参考标准委员会的基本文件来回答,事实上,该文件确实解决了该问题,但是只是简短地:
C89之前的实现在保留的单独名称空间的数量上有很大不同。该标准所采用的位置是允许根据上下文区分尽可能多的独立名称空间,除了所有标记(结构,联合和枚举)都包含一个名称空间。
(C99 rationale文档, * 第6.2.3节)
因此,诸如此类的代码显然是有意的
struct point { int point; } point = { .point = 0 };
goto point;
point:
return point.point;
允许。我对基本原理的解释是,意图是不受限制的,尽管目前尚不清楚为什么不给不同种类的标记分配单独的命名空间。这可能不是偶然的,因此委员会中代表的一个或多个参与方必须具有相对的独立标签名称空间,并且它们设法占了上风。这种反对很可能是出于商业目的,而不是出于技术原因。
* 据我所知,没有C2011标准的基本文件。至少还没有。