为什么 c++ 的命名空间范围还包括文件范围(在 c 中)?



C(ISO/IEC 9899:2011(没有命名空间的概念,当引用全局变量的范围时,标准使用file scope:

每个其他标识符的作用域由其声明的位置(在声明符或类型说明符中(决定。如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,则标识符具有文件作用域,该文件作用域终止于转换单元的末尾。如果声明标识符的声明符或类型说明符出现在块内部或函数定义中的参数声明列表中,则标识符具有块作用域,该块作用域终止于关联块的末尾。如果声明标识符的声明符或类型说明符出现在函数原型(不是函数定义的一部分(中的参数声明列表中,则标识符具有函数原型作用域,该作用域终止于函数声明符的末尾。如果一个标识符在同一名称空间中指定了两个不同的实体,那么作用域可能会重叠。如果是这样,一个实体(内部范围(的范围将严格在另一个实体的范围(外部范围(之前结束。在内部范围内,标识符指定在内部范围中声明的实体;在外部作用域中声明的实体在内部作用域中是隐藏的(不可见(。

然而,在c++(至少ISO/IEC 14882:2011(中,从未使用file scope,而是使用命名空间作用域:

命名空间定义的声明性区域是其命名空间主体。在命名空间主体中声明的实体被称为命名空间的成员,并且由这些声明引入命名空间的声明性区域的名称被称为该命名空间的成员名称。命名空间成员名称具有命名空间作用域。它的潜在作用域包括从名称的声明点开始的名称空间;对于指定成员命名空间的每个using指令([namespace.udir](,成员的潜在范围包括using指令的潜在范围中位于成员声明点之后的部分。

正如我们所知,c++在很大程度上受到了c的启发,因此许多术语的定义也源于c,尽管它们现在实际上是两种不同的语言。IMO,c++使用名称空间作用域而不是文件作用域应该是有原因的,但我不知道。背后是什么?

C++标准没有提到文件范围,因为它没有试图用C语言解释。它定义并使用自己的术语。在这种情况下,它属于名称空间的定义:

[basic.namespace]

2翻译单元的最外层声明性区域是命名空间;请参阅〔basic.scope.namespace〕。

用C++术语来说,这个声明性区域相当于C的文件作用域。C++标准之所以使用这些定义,是因为它打算支持命名空间声明,使我们能够将这个范围划分为更小的部分。

C没有这样的特性,所以它只说文件范围是它最外层的范围,因为所说的定义就足够了。

您询问的是文件范围,而不是函数范围。

C++之所以转而讨论名称空间范围,是因为它有名称空间。C没有。所以C当然不会有命名空间作用域。

C和C++是不同的语言。C++不会把事情变成"不是C",它之所以会改变事情,是因为它的设计者认为这些改变会让语言本质上"更好",无论是直接的,还是由于某些仅限C++的特性的存在,这些特性反过来又使语言比C"更好"。

最新更新