我有一个命名空间 foo
,其中包含一个整数 bar
,声明如下...
foo.h:
namespace foo {
int bar;
}
现在,如果我将 foo.h
仅包含在一个文件中,则效果很好。但是当我从两个或多个文件中包含 foo.h
时会出现问题:我收到链接器错误。我发现如果我将 bar
声明为 static
,我可以在多个文件中包含 foo.h
。这对我来说似乎很奇怪,因为我不知道可以在命名空间内声明一个静态变量。 (这甚至意味着什么?)
为什么会这样?更重要的是,为什么不它工作没有 static
?在 namespace
中使用时,static
是什么意思?
最佳答案
static
在不同的上下文中有多种含义。在这个特定的上下文中,这意味着变量具有内部链接,因此包含该标题的每个翻译单元都将拥有它自己的变量拷贝。
请注意,虽然这会静默链接器错误,但它会为每个生成的目标文件维护一个单独的 foo::bar
变量(更改在不同的目标文件中不可见)。
如果你想要一个单一的变量,你应该在标题中将它声明为 extern
并在一个翻译单元中提供一个单一的定义。
关于c++ - 命名空间中的静态变量与非静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11623451/