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

陳 力*_*陳 力 1 c++ scope namespaces language-lawyer

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

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

但是,在c ++(至少ISO/IEC 14882:2011)中,file scope永远不会使用并使用命名空间范围:

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

我们知道,c ++受到了很多C语言的启发,因此许多术语的定义也来自c,尽管它们现在几乎是两种不同的语言.IMO,应该有一个原因,c ++使用命名空间范围而不是文件范围,但我不知道.背后是什么?

Sto*_*ica 5

C++标准没有提到文件范围,因为它不是用C语言来解释事物.它定义并使用自己的术语.在这种情况下,它在命名空间的定义下:

[basic.namespace]

2翻译单元的最外层声明区域是命名空间; 见[basic.scope.namespace].

用C++术语来说,这个声明区域相当于C的文件范围.C++标准使用这些定义,因为它打算支持名称空间声明,这允许我们将此作用域划分为更小的部分.

C没有这样的功能,所以它只说文件范围内的东西作为它的最外层范围,因为所说的定义就足够了.