【问题标题】:What is the difference between declaring a static constant and a constant into unnamed namespace?将静态常量和常量声明到未命名的命名空间有什么区别?
【发布时间】:2014-05-13 12:49:26
【问题描述】:

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

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

那么有什么区别呢?

【问题讨论】:

  • `static' 在以前的标准 c++0x 中已弃用。但是,它已针对 C++11 标准进行了更正。基本上他们在做同样的工作(即静态链接)。 stackoverflow.com/questions/4726570/…

标签: c++ static namespaces constants


【解决方案1】:

既然是const,那么两者都有内部联动,没有区别。所以让我们考虑一个更有趣的情况,它不是const

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

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

【讨论】:

  • 在这种特殊情况下(const 未声明 extern),它们实际上都具有内部链接...
  • 在 C++98 中对模板有影响。只有指向具有外部链接的对象的指针才能用作非类型模板参数。
  • @AndreyChernyakhovskiy:确实,我想过提及这一点,但我对过时标准的记忆消失得太快了,无法确定那个特别奇怪的细节。
  • 除了namespace { 之外,我已经养成了(几乎可以肯定是坏的)习惯,即包含static 只是作为对链接器的提示。我不相信它是否足够聪明地意识到在其他地方无法访问未命名命名空间的内容,而且我的链接需要很长时间,以至于我愿意抓住稻草。
  • @MikeSeymour,这是我所知道的在实践中唯一不同的事情。在 C++11 中,似乎没有实际的区别。
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 2013-09-18
  • 1970-01-01
  • 2012-11-15
  • 2012-10-22
  • 2015-11-21
  • 1970-01-01
  • 2012-07-19
相关资源
最近更新 更多