C/C++ 开发:全局变量在多文件中的使用 ---一个链接问题的解决
背景:碰到一个链接问题:ID_decode.obj : error LNK2005: "char * ReadPath" ([email protected]@3PADA) 已经在 Head_decode.obj 中定义
原因:char* HeadPatch 这个全局变量在.h 中赋值,然后此.h 又被ID_decode.cpp 和Head-decode.cpp 包含,重复定义;
尝试:使用条件编译和#progma once都不好使;
解决:在随便一个.cpp 中“定义”全局变量(int B=0;),在一个头文件A.h中添加声明 extern B; ,然后在所有其他需要使用全局变量B的.cpp 文件中include “A.h”
原理:首先要明白什么是声明,什么是定义:
声明:我说有A这么个东西,但不知道在哪里赋值;
定义:这个东西在这里,并给出了变量的赋值 或者 函数的实现;
特性:
一个头文件.h 只有声明(类声明,函数声明,extern声明(不可赋值)),可以被多个.cpp 包含。
一个头文件,如果包含了定义,那么就是只能被单个cpp包含。
所以,如果你想在头文件中“定义”全局变量(int A = 0),要确保此头文件只被一个.Cpp包含;
如果你想在多个.cpp 中使用同样的全局变量,而又不想在不同的.cpp 中都添加extern,那么,你可以这样做:在随便一个.cpp 中“定义”全局变量(int B=0;),在一个头文件A.h中添加声明 extern B; ,然后在所有其他需要使用全局变量B的.cpp 文件中include “A.h”.
出错情况1:在.h 中“定义”了全局变量A,然后在不同的.cpp 中使用extern int A;(本例子)
这种编译不会报错,但是链接会显示A已经在不同的.obj中定义;提示错误:ID_decode.obj : error LNK2005: "char * ReadPath" ([email protected]@3PADA) 已经在 Head_decode.obj 中定义。
错误情况2:被多个.cpp 包含,如果.h 中的全局变量被赋值,
提示错误:“ReadPath”: 重定义;多次初始化。
拓展:如果使用extern来声明局部变量会怎样?
运行结果:
实际原因是局部变量太大,导致栈溢出;PC上vS可以调栈到2G:
尽管如此,我们还是不要用extern来声明cpp中的局部变量,按照规矩来,还是要对全局变量使用extern。