为什么C为标签和标识符具有单独的名称空间?

Ben*_*urk 5 c namespaces

来自cppreference

1)标签名称空间:所有声明为标签的标识符。

2)标记名称:声明为结构,联合和枚举类型名称的所有标识符。

3)成员名称:声明为任一结构或联合的成员的所有标识符。每个结构和联合都引入自己的这种名称空间。

4)所有其他标识符,称为区别于(1-3)的普通标识符(函数名称,对象名称,typedef名称,枚举常量)。

这允许这样的代码(除其他外):

struct Point { int x, y; };
struct Point Point;
Run Code Online (Sandbox Code Playgroud)

对我来说,这段代码似乎有些不清楚,因为Point可以同时引用结构的类型和实例。为标签和其他标识符使用单独的名称空间的背后动机是什么?

Joh*_*ger 4

提出的实际问题是

为标签和其他标识符提供单独的名称空间的动机是什么?

这个问题只能通过参考标准委员会的理由文件来回答,该文件实际上确实解决了这个问题,尽管很简短:

C89 之前的实现在维护的单独名称空间的数量方面差异很大。标准中采用的立场是允许通过上下文区分尽可能多的单独名称空间,但所有标签(结构、联合和枚举)都包含单个名称空间。

C99 基本原理文档,*第 6.2.3 节)

因此,诸如此类的代码是明确有意的

struct point { int point; } point = { .point = 0 };
goto point;
point:
return point.point;
Run Code Online (Sandbox Code Playgroud)

是允许的。我对其基本原理的解释是,其意图是不受限制,尽管目前还不清楚为什么不同类型的标签没有被赋予单独的名称空间。这不可能是偶然的,因此委员会中的一个或多个代表肯定反对单独的标签命名空间,并且他们成功地获胜了。这种反对很可能是出于商业原因,而不是技术原因。


*据我所知,C2011 标准没有任何理由文档。至少现在还没有。

  • 鉴于这句话,听起来委员会正在努力保持尽可能多的现有代码的兼容性。如果野外代码依赖于编译器很好地维护单独的命名空间...... (2认同)