外部变量未定义

时间:2015-12-09 17:39:48

标签: c++ undefined extern

我正面临外部变量声明的问题。我有一堆包含结构定义的.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编译顺序得到了分段错误。

我走向这种方法,但现在它甚至没有编译.... 有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

SystemASystemB也应使用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