这是有效的C++包含模式吗?
Is this a valid C++ include pattern?
我在包含文件中有遵循此模式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;
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 为什么在保护模式下继承升级不起作用
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- 这是有效的C++包含模式吗?
- Gettin 目标模式不包含来自未修改的生成文件的"%"?
- 正则表达式:从模式字符串 1.string2'string3 中提取字符串,其中字符串 1 可以包含 '." 字符
- 崇高文本 2 文件包含模式
- QRegExp :搜索不包含其他模式的模式
- 用于检查整数是否包含给定十六进制模式的c++代码
- GCC中包含的文件更详细的模式