如何正确初始化全局变量?

新手上路,请多包涵

我正在编写一个小学生项目,并遇到了一个问题,即我有一些全局变量并且需要在一些源文件中使用它,但是我收到错误 undefined reference to variable_name 。让我们创建三个源文件,例如:

tst1.h:

 extern int global_a;
void Init();

tst1.cpp:

 #include "tst1.h"
void Init(){
  global_a = 1;
}

tst2.cpp:

 #include "tst1.h"
int main(){
  Init();
}

当我编译和链接时,这就是我得到的:

 $ g++ -c tst1.cpp
$ g++ -c tst2.cpp
$ g++ tst2.o tst1.o
tst1.o: In function `Init()':
tst1.cpp:(.text+0x6): undefined reference to `global_a'
collect2: error: ld returned 1 exit status

如果我删除 extern 语句,那么我会遇到另一个问题,让我展示一下:

 $ g++ -c tst1.cpp
$ g++ -c tst2.cpp
$ g++ tst2.o tst1.o
tst1.o:(.bss+0x0): multiple definition of `global_a'
tst2.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status

我真的需要一些全局变量,例如我的小项目使用汇编代码,并且有一个像 string rax = “%rax %eax %ax %ah %al”; 这样的变量。应该通过不同的源文件引用。

那么,如何正确初始化全局变量呢?

原文由 Hi-Angel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 650
2 个回答

您只声明了变量但没有定义它。这个记录

extern int global_a;

是声明而不是定义。要定义它,您可以在任何模块中编写

int global_a;

或者最好通过以下方式定义函数 init

 int Init { /* some code */; return 1; }

并在 main 函数之前的 main 模块中编写

int global_a = Init();

原文由 Vlad from Moscow 发布,翻译遵循 CC BY-SA 3.0 许可协议

tst1.cpp 应该改为:

 #include "tst1.h"

int global_a = 1;

void Init(){
}

您还可以将初始化程序行编写为:

 int global_a(1);

或者在 C++11 中:

 int global_a{1};

全局应该只在 一个 源文件中 _定义_(即不带 extern 前缀),而 不是 在头文件中。

原文由 Mike DeSimone 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题