【问题标题】:Static and anonymous namespace [duplicate]静态和匿名命名空间 [重复]
【发布时间】:2012-11-20 08:45:14
【问题描述】:

可能重复:
Unnamed/anonymous namespaces vs. static functions

这是完全多余的,还是有理由这样做?

namespace {
  static void f() {
    ...
  }
}

【问题讨论】:

  • 看到那个,它回答了所有问题:[未命名/匿名命名空间与静态函数][1] [1]:stackoverflow.com/questions/154469/…
  • @phbd 那里有一条评论指出未命名的命名空间仍然获得外部链接。你知道/你能解释一下这是什么意思吗?
  • @baruch:看我的回答——正如标准中的引述所表明的那样,这意味着发表评论的人是错误的。

标签: c++


【解决方案1】:

在我看来它是多余的——被声明为静态或在匿名命名空间中意味着它具有内部链接。

§3.5/3:

具有命名空间范围 (3.3.6) 的名称如果是以下名称,则具有内部链接:
— 显式声明为静态的变量、函数或函数模板;

§3.5/4:

[...] 未命名命名空间或在未命名命名空间中直接或间接声明的命名空间具有内部链接。 [...] 具有命名空间范围的名称 上面给出的内部链接与封闭命名空间具有相同的链接,如果它是
的名称 - 一个变量;或
——一个函数;或

因此,就像现在一样,它具有内部链接,因为它被显式声明为静态。如果它没有显式声明为静态的,它将具有内部链接,因为它是在未命名的命名空间内声明的。无论哪种方式效果都一样。

请注意,我在这里专门针对函数进行回复——在处理类型名称(例如,类/结构/union),但我不知道有任何此类适用于函数的情况。

就内部链接的真正含义而言,这是标准实际上非常直接和明确的地方之一。最好引用所有三种可能性的定义(§3.5/2):

  1. 当名称具有外部链接时,它所表示的实体可以由其他翻译单元的范围或同一翻译单元的其他范围的名称引用。
  2. 当名称具有内部链接时,它所表示的实体可以由同一翻译单元中其他范围的名称引用。
  3. 当一个名称​​没有链接时,它所表示的实体不能被其他范围的名称引用。

请注意,上面的斜体字与标准中的斜体字相匹配,这就是说这些句子定义了这些短语在标准其余部分中的含义。

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2015-08-01
    相关资源
    最近更新 更多