24

从 C++11 标准的角度来看,对象状态/属性之间是否存在技术差异:

namespace
{
   int foo;
   const int bar = 42;
}

namespace
{
   static int foo;
   static const bar = 42;
}

?


从这里的问题和答案中,我相信匿名命名空间中的对象是隐式静态的,但是有人告诉我,它只是内部的链接,编译器不会将对象当作标记为静态的对象,并暗示它将如何实现对象建造。所以我需要一些关于它真正含义的细节,如果在匿名命名空间中使用和不使用静态之间存在差异。

4

2 回答 2

32

C++11、3.5/4:

未命名的命名空间或在未命名的命名空间中直接或间接声明的命名空间具有内部链接。所有其他命名空间都有外部链接。具有命名空间范围但上面没有给出内部链接的名称,如果它是一个变量......

所以在 C++11 中,你的两个foo对象都有内部链接。在 C++03 中,第一个具有外部链接。

无论联动,它都有静态存储时长。

I don't think there's any such thing in the standard as "take the object as if it was marked static", so I can't answer to that. If you find some text in the standard that refers to whether the object is "marked static" and doesn't refer specifically to either linkage or storage duration, then cite it and I can give you an opinion :-)

于 2012-11-15T11:43:01.747 回答
3

有一个很大的区别:与static,名字有内部联系;没有它,它具有外部链接(但在您不能在另一个翻译单元中引用的命名空间中)。区别并不总是很重要,但在某些情况下确实会发挥作用:例如,如果您有一个带有int*参数的模板,则不能在&fooif foois declared上实例化它static

编辑:

正如 Steve Jessop 所指出的,这仅在 C++03 中是正确的。C++11 确实在这里做出了改变。虽然不知道为什么;我发现 C++03 规范更加连贯——某些东西所在的命名空间不应该影响链接。

于 2012-11-15T11:40:42.447 回答