这是一个有效的C ++包含模式吗? [重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

我在包含文件中遵循此模式的C ++:

#ifdef MYHEADER
extern ClassA globalA;
#endif
#ifndef MYHEADER
#define MYHEADER
class ClassA {
    // code for ClassA
    };
static ClassA globalA;
#endif

希望只有一个ClassA实例(globalA),它只在头文件中定义。这是旧代码,我正在尝试清理而不进行大规模更改。

我看到的问题是在调试器中有(至少)两个不同的globalA实例(两个不同的地址)。我搜索了其他声明,甚至注释掉了静态声明,以确保我收到链接错误(我做了)。这段代码是有线程的。

这是一个有效的模式吗?我可能误解了什么?有没有更好的方法来做到这一点(不需要更改globalA的所有引用)?

c++ windows
1个回答
1
投票

你的模式没有做你认为它做的事情。

翻译单元彼此独立编译。每个想要使用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;
© www.soinside.com 2019 - 2024. All rights reserved.