Hi-*_*gel 5 c++ variables global-variables
我正在编写一个小学生项目,并遇到了一个问题,即我有几个全局变量并且需要在几个源文件中使用它,但是我收到错误 *未定义对 variable_name 的引用*。例如,让我们创建三个源文件:
tst1.h:
extern int global_a;
void Init();
Run Code Online (Sandbox Code Playgroud)
tst1.cpp:
#include "tst1.h"
void Init(){
global_a = 1;
}
Run Code Online (Sandbox Code Playgroud)
tst2.cpp:
#include "tst1.h"
int main(){
Init();
}
Run Code Online (Sandbox Code Playgroud)
当我编译和链接时,这就是我得到的:
$ 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
Run Code Online (Sandbox Code Playgroud)
如果我删除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
Run Code Online (Sandbox Code Playgroud)
但是我真的需要一些全局变量,例如我的小项目使用汇编代码,并且有一个像string rax = "%rax %eax %ax %ah %al";这样的变量。应该通过不同的源文件引用。
那么,如何正确初始化全局变量呢?
您只声明了变量但没有定义它。这条记录
extern int global_a;
Run Code Online (Sandbox Code Playgroud)
是声明而不是定义。要定义它,您可以在任何模块中编写
int global_a;
Run Code Online (Sandbox Code Playgroud)
或者最好按以下方式定义函数 init
int Init { /* some code */; return 1; }
Run Code Online (Sandbox Code Playgroud)
并在主模块中的函数 main 之前编写
int global_a = Init();
Run Code Online (Sandbox Code Playgroud)