C++ How to properly initialize global variables?
本问题已经有最佳答案,请猛点这里访问。
我正在编写一个小的学生项目,并一直面临这样一个问题:我有一些全局变量,需要在一些源文件中使用它,但是我得到了错误*未定义的变量名引用*。让我们创建三个源文件,例如:
TST1.H:
1 2 | extern int global_a; void Init(); |
TST1.CPP:
1 2 3 4 | #include"tst1.h" void Init(){ global_a = 1; } |
TST2.CPP:
1 2 3 4 | #include"tst1.h" int main(){ Init(); } |
当我编译和链接时,我得到了:
1 2 3 4 5 6 | $ 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语句,则会出现另一个问题,让我演示:
1 2 3 4 5 6 | $ 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 |
但是我确实需要一些全局变量,例如我的小项目使用汇编代码,并且有一个变量,比如字符串rax="%rax%eax%ax%ah%al";应该通过不同的源文件引用它。
那么,如何正确初始化全局变量呢?
您只声明了变量,但没有定义它。这张唱片
1 | extern int global_a; |
是声明而不是定义。要定义它,您可以在任何模块中编写
1 | int global_a; |
或者最好用下面的方法定义函数init
1 | int Init { /* some code */; return 1; } |
并在主模块前功能主写
1 | int global_a = Init(); |
1 2 3 4 5 6 | #include"tst1.h" int global_a = 1; void Init(){ } |
也可以将初始值设定项行编写为:
1 | int global_a(1); |
或者在C++ 11中:
1 | int global_a{1}; |
全局只应在一个源文件中定义(即不使用
您需要添加
1 2 3 4 | #ifndef TST1_H #define TST1_H ..... #endif |
到tst1.h。它包含在tst2.cpp中两次