这个问题在这里已有答案:
我在包含文件中遵循此模式的C ++:
#ifdef MYHEADER
extern ClassA globalA;
#endif
#ifndef MYHEADER
#define MYHEADER
class ClassA {
// code for ClassA
};
static ClassA globalA;
#endif
希望只有一个ClassA实例(globalA),它只在头文件中定义。这是旧代码,我正在尝试清理而不进行大规模更改。
我看到的问题是在调试器中有(至少)两个不同的globalA实例(两个不同的地址)。我搜索了其他声明,甚至注释掉了静态声明,以确保我收到链接错误(我做了)。这段代码是有线程的。
这是一个有效的模式吗?我可能误解了什么?有没有更好的方法来做到这一点(不需要更改globalA的所有引用)?
你的模式没有做你认为它做的事情。
翻译单元彼此独立编译。每个想要使用globalA
的翻译单元都需要知道ClassA
的定义。因此,每次编译一个给定的翻译单元时,MYHEADER
将不会被定义,直到你的头文件定义它,因此每个翻译单元最终都会看到static
声明,所以每个翻译单元都会获得自己的globalA
本地副本,这不是你想要的。
要做你正在尝试的事情,你需要
#ifdef
块。static
声明替换extern
声明。globalA
变量实例移动到您的一个cpp文件中。MyHeader.h
#ifndef MYHEADER
#define MYHEADER
class ClassA {
// code for ClassA
};
extern ClassA globalA;
#endif
MyHeader.cpp
#include "MyHeader.h"
ClassA globalA;