【发布时间】:2019-05-11 10:33:47
【问题描述】:
C(ISO/IEC 9899:2011)没有命名空间的概念,当引用全局变量的作用域时,标准使用file scope:
每个其他标识符的范围由其声明的位置决定(在声明符或类型说明符中)。如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,则标识符具有文件范围,该范围在翻译单元的末尾终止。如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表内,则标识符具有块作用域,该作用域在相关块的末尾终止。如果声明标识符的声明符或类型说明符出现在函数原型(不是函数定义的一部分)的参数声明列表中,则标识符具有函数原型范围,该范围终止于函数声明符的末尾。如果标识符在同一名称空间中指定两个不同的实体,则范围可能重叠。如果是这样,一个实体的范围(内部范围)将严格在另一个实体的范围(外部范围)之前结束。在内部范围内,标识符指定在内部范围内声明的实体;在外部范围内声明的实体在内部范围内是隐藏的(不可见)。
但是,在 c++(至少 ISO/IEC 14882:2011)中,file scope 从未使用过,而是使用namespace scope:
命名空间定义的声明区域是它的命名空间主体。在命名空间主体中声明的实体被称为命名空间的成员,由这些声明引入命名空间的声明区域的名称被称为命名空间的成员名称。命名空间成员名称具有命名空间范围。它的潜在范围包括从名称声明点开始的名称空间;对于每个指定成员命名空间的 using 指令 ([namespace.udir]),成员的潜在范围包括在成员声明点之后的 using 指令的潜在范围部分。
正如我们所知,c++ 从 C 中汲取了很多灵感,因此许多术语的定义也源自 c,尽管它们现在实际上是两种不同的语言。 IMO,c ++使用命名空间范围而不是文件范围应该是有原因的,但我不知道。背后是什么?
【问题讨论】:
-
因为 C 作为模块化的一个非常非常糟糕的概念,而 C++ 试图纠正它。请忘记尝试将 C 概念与 C++ 概念相关联,现在您将受益于将它们视为真正(而非虚拟)两种不同的语言。
-
它们不是“实际上两种不同的语言”。它们是两种不同的语言,句号,故事的结尾。
-
FWIW,您的函数会询问 3 个不同的问题,我不确定您真正想知道什么。标题使用文件范围,您的正文说功能范围(您的报价中不存在)然后您问为什么要使用名称空间,实际问题是什么?
标签: c++ scope namespaces language-lawyer