我正面临外部变量声明的问题。我有一堆包含结构定义的.cpp文件:
const System SystemA = {"A", 1, 2 ...}; //In A.cpp
const System SystemB = {"B", 1, 2 ...}; //In B.cpp
...
这些Cpp文件只是服务器作为添加新结构的简单方法,并且可以轻松查找一个特定的结构定义。 (因为我可能有100个定义,每个定义都是多行[50]代码)。
当我尝试在另一个编译单元(.cpp)中使用它们时:
extern const System SystemA;
extern const System SystemB;
...
void InitStructs(){
SystemA.Init();
SystemB.Init();
...
}
我刚刚获得undefined reference to SystemA
undefined reference to SystemB
,依此类推。
我正在进行统一初始化,因为我在每个system.cpp中进行初始化作为静态动态初始化。但这是有风险的,因为无法确保初始化顺序(静态初始化顺序惨败)。因此,我根据cpp编译顺序得到了分段错误。
我走向这种方法,但现在它甚至没有编译.... 有什么帮助吗?
答案 0 :(得分:1)
SystemA
和SystemB
也应使用extern
关键字定义:
extern const System SystemA = {"A", 1, 2 ...}; //In A.cpp
extern const System SystemB = {"B", 1, 2 ...}; //In B.cpp
或者您可以制作标题,例如Globals.h
,声明他们:
extern const System SystemA;
extern const System SystemB;
这样可以保证它们在包含标题的所有编译单元中具有相同的链接。之后,您可以在没有extern
关键字的情况下定义它们,因为extern
声明已经可见:
<强> A.cpp 强>
#include "Globals.h"
const System SystemA = {"A", 1, 2 ...};
<强> B.cpp 强>
#include "Globals.h"
const System SystemB = {"B", 1, 2 ...};
答案 1 :(得分:1)
在C ++中,全局范围内的const
对象默认也是static
,即它们在源文件外部不可见。要解决此问题,请为每个定义添加extern
。