我可能误解了静态对象的工作原理。假设如下
common.hpp
struct common {};
static std::unique_ptr<common> global_ptr;
Foo.cpp中
#include "common.hpp"
void bar();
int main()
{
global_ptr = std::make_unique<common>();
bar();
}
bar.cpp
#include "common.hpp"
void bar()
{
*global_ptr; // crashes, because global_ptr is empty
}
我能够调试这种情况,&global_ptr
和main()
中的bar()
不同,为什么会这样? global_ptr
肯定已在main()
中初始化,我可以毫无问题地使用它,但为什么global_ptr
中的bar()
似乎已经整合了?
答案 0 :(得分:3)
static
变量意味着internal linkage。
可以从当前翻译单元中的所有范围引用该名称。
这意味着不同翻译单元中的global_ptr
是不同的对象。静态变量在其自己的翻译单元之外是不可见的。可能有许多名称为global_ptr
的对象,但每个翻译单元只有一个。
如果您只想要一个全局变量,可以在common.hpp
中将其声明为:
extern std::unique_ptr<common> global_ptr;
并在cpp文件中定义它(可能是common.cpp
):
std::unique_ptr<common> global_ptr;
答案 1 :(得分:2)
Globals的行为与没有static关键字的行为相似。 静态意味着全局实际上是翻译单元的本地。 您的困惑来自于静态在全局范围和功能范围内意味着不同的事实。