代码之家  ›  专栏  ›  技术社区  ›  Chen Li

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

  •  1
  • Chen Li  · 技术社区  · 7 年前

    file scope :

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

    文件范围 永远不会被使用和使用 namespace scope

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

    正如我们所知道的,C++从C中受到启发,所以许多术语的定义也源自C,尽管它们实际上是两种不同的语言。IMO,应该有C++使用命名空间范围而不是文件范围的原因,但我不知道。背后是什么?

    2 回复  |  直到 7 年前
        1
  •  5
  •   StoryTeller - Unslander Monica    7 年前

    C++标准没有提及 因为它不是用C语言来解释。它定义并使用自己的术语。在本例中,它属于名称空间的定义:

    [basic.namespace]

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

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

        2
  •  2
  •   Lightness Races in Orbit    7 年前

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

    C++代替名称空间范围的原因是它具有命名空间。C没有。所以C当然不会有名称空间范围。