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来声明局部变量会怎样?
C/C++ 开发:全局变量在多文件中的使用 ---一个链接问题的解决

运行结果:

C/C++ 开发:全局变量在多文件中的使用 ---一个链接问题的解决

实际原因是局部变量太大,导致栈溢出;PC上vS可以调栈到2G:

C/C++ 开发:全局变量在多文件中的使用 ---一个链接问题的解决

尽管如此,我们还是不要用extern来声明cpp中的局部变量,按照规矩来,还是要对全局变量使用extern。