【问题标题】:Why does c++'s namespace scope also include file scope(in c)?为什么 c++ 的命名空间范围还包括文件范围(在 c 中)?
【发布时间】: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


【解决方案1】:

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

[basic.namespace]

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

在 C++ 术语中,这个声明性区域等同于 C 的文件范围。 C++ 标准使用这些定义是因为它打算支持命名空间声明,这允许我们将此范围划分为更小的部分。

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

【讨论】:

    【解决方案2】:

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

    C++ 讨论命名空间范围的原因是它有命名空间。 C没有。所以当然 C 不会有命名空间范围。

    C 和 C++ 是不同的语言。 C++ 不会将事物改变为“不是 C”,它会改变事物,因为它的设计者认为这些改变是为了使语言本质上“更好”,无论是直接的,还是由于某些 C++-only 特性的存在而反过来使比 C 语言“更好”的语言。

    【讨论】:

      猜你喜欢
      • 2022-07-06
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多