我在包含文件中有遵循此模式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
我的标题.cpp
#include "MyHeader.h"
ClassA globalA;