这是有效的C++包含模式吗?



我在包含文件中有遵循此模式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;

最新更新