从C ++ 11标准的角度来看,对象状态/属性之间存在技术差异:
namespace
{
int foo;
const int bar = 42;
}
和
namespace
{
static int foo;
static const bar = 42;
}
从这里的问题和答案我相信匿名命名空间中的对象是隐式静态的,但是有人告诉我它只是内部的链接,编译器不会将对象视为静态标记,如同它的含义将实施对象构建。所以我需要一些关于它真正含义的细节,如果匿名命名空间中有和没有静态之间存在差异。
答案 0 :(得分:30)
C ++ 11,3.5 / 4:
直接或间接声明的未命名命名空间或命名空间 在未命名的命名空间内有内部链接。所有其他名称空间 有外部联系。具有未命名的命名空间范围的名称 上面给出的内部连接具有与封闭相同的连接 名称空间,如果它是 - 变量...
的名称
所以在C ++ 11中,你的foo
个对象都有内部链接。在C ++ 03中,第一个有外部链接。
无论链接如何,它都有静态存储持续时间。
我认为标准中没有任何“将对象视为静态标记”,所以我无法回答这个问题。如果您在标准中发现某些文本引用该对象是否“标记为静态”并且没有具体指向链接或存储持续时间,那么请引用它并且我可以给您一个意见: - )
答案 1 :(得分:1)
有一个很大的区别:static
,名称有内部联系;没有它,它有外部链接(但是在名称空间中,你可以在另一个翻译单元中引用)。差异并不总是重要的,但在某些情况下确实会发挥作用:例如,如果您的模板带有int*
参数,则无法在&foo
foo
上实例化{ {1}}被声明为static
。
正如Steve Jessop指出的那样,这只适用于C ++ 03。 C ++ 11确实在这里进行了更改。虽然我不知道为什么;我发现C ++ 03规范更加连贯 - 命名空间不应该影响链接。