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

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();


tst1.cpp应改为:

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};

全局只应在一个源文件中定义(即不使用extern前缀编写),而不应在头文件中定义。


您需要添加

1
2
3
4
#ifndef TST1_H
#define TST1_H
.....
#endif

到tst1.h。它包含在tst2.cpp中两次