声明静态常量和将常量放入未命名的命名空间有什么区别?

4

据我所知,有两种方法声明一个只在一个文件中可见的常量变量:

  1. 声明 static const int VARIABLE = 1
  2. 在一个未命名的命名空间中声明它:
namespace { const int VARIABLE = 1; }

那么它们有什么区别呢?


"static" 在之前的 C++0x 标准中已被弃用。然而,在 C++11 标准中进行了修正。基本上它们执行相同的任务(即静态链接)。https://dev59.com/32445IYBdhLWcg3wucio - 101010
1个回答

3

既然是const,那么两者都具有内部链接,没有区别。因此,让我们考虑更有趣的情况,即它不是const

在这种情况下,实际上几乎没有区别。

从技术上讲,第一个将具有内部链接,因此名称无法从另一个翻译单元中访问;第二个将具有外部链接,但由于其周围的命名空间无法命名,因此无法从另一个翻译单元中访问。


2
在这种特殊情况下(一个未声明为externconst),它们实际上都具有内部链接... - Angew is no longer proud of SO
1
在C++98中,这对模板产生了影响。只有具有外部链接的对象指针可以用作非类型模板参数。 - ach
@AndreyChernyakhovskiy:确实,我考虑过提到这一点,但是我对过时标准的记忆正在迅速消退,无法确定那种特别的怪异情况的细节。 - Mike Seymour
我已经养成了一个(几乎肯定是不好的)习惯,即除了namespace {之外,还包括static,只是作为提示链接器的一种方式。我不确定它是否足够聪明,能够意识到未命名命名空间的内容在其他地方是无法访问的,而我的链接时间如此之长,以至于我愿意抓住任何可能的机会。 - dlf
@MikeSeymour,就我所知,这是实践中唯一不同的事情。在C++11中,似乎没有实际区别。 - ach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接