c++ - 命名空间中的静态变量与非静态变量

标签 c++ static namespaces

我有一个命名空间 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/

相关文章:

jquery - Django 管理 - jQuery 命名空间

C++ 基本多线程故障排除

c - 为什么此语句会在 gcc 中产生链接器错误?

C++ 命名空间 : cross-usage

c++ - 我应该#include 在我的库的命名空间中吗?

c - 如果未初始化,自动变量是否具有静态生命周期?

进行构造函数转换时 C++ 运算符重载

c++ - 将检测到的文本设置为比图像暗 - ccv

c++ - 无效的 PE 文件 x64dbg

node.js - Express/Node/Cloud9 - 提供静态文件的问题