引发的重定义冲突情况
对于那些简单的重命名冲突再此不再赘述。
情况一
在不同的头文件当中定义同名的全局变量,在运行时会出现重定义的错误。给出一个示例。
//file1.h
int res = 10; //在file1.h定义一个全局的res变量
//file2.h
int res = 10; //file2.h定义一个全局的res变量
//main.cpp
int main(){
return 0;
}
一个项目当中如上的文件组织结构无法通过编译,会出现重定义的错误。如果为变量添加const 声明即可通过编译,其底层原理在《C++ Primer 5th》当中有解释:在默认情况下,const对象被设定为仅在当前文件当中有效.当多个文件中出现多个同名的const变量时,等效于在不同文件当中定义了独立的变量。
//file1.h
const int res = 10; //在file1.h定义一个全局的res常量
//file2.h
const int res = 10; //file2.h声明一个全局的res常量
在编译的过程当中,编译器会把file1.h和file2.h文件中所有使用了res的地方都替换成10。
情况二
//file1.h
const int res = 10; //在file1.h定义一个全局的res常量
//file2.h
const int res = 10; //file2.h声明一个全局的res常量
//main.cpp
#include "file1.h"
#include "file2.h"
int main(){
return 0;
}
也就是在情况一解决的基础上,在main函数文件当中包含两个头文件也会导致重定义的错误。
情况三
针对情况一当中的情景,如果常量需要在很多文件使用到,且占存空间很大,那么就会造成大量的冗余,在这种情况下给出一种解决方案:对于const变量不管是声明还是定义都添加extern,这样就只需要定义一次就可以了。
//file1.h
extern const int res;//在file1.h声明一个全局的res常量
//file1.cpp
extern const int res = 10; //和file1.h当中的res是同一个
//file2.h
//如果file2想要使用file1.h当中 的res
#include "file1.h"
int arr = res; //可以直接访问,arr=10
在这当中extern关键字的作用是告诉编译器,该变量不是本文件所独有,它的定义将出现在别处。等同于在其他文件当中共享res常量。其他地方要想使用res常量,只需要在文件当中包含#include "file1.h"
即可。
至于产生以上问题的原因目前的知识储备只知道是链接过程出现了问题,链接过程当中发生了什么还在继续的探索中,留个传送门~
记录C++学习历程,一起加油。