————————————————
参考链接:https://blog.csdn.net/baidu_35679960/article/details/79200865
https://jakelin.cn/C++/
————————————————
C语言可以在不同的源文件中定义相同名字的全局变量吗?
不使用static的时候,两个不同的源文件都可以正常编译,但会出现链接错误,原因是有两个地方存在相同的变量,导致编译器无法识别应该使用哪一个。
关于全局变量的几点说明:
①默认情况下,C语言中的全局变量和函数的作用域仅限于定义和声明这个函数或变量的内部,如果需要从这个C文件之外访问这些函数或者全局变量就需要使用 extern关键字进行声明,这是因为C编译器是以C文件为单位进行编译的,如果这个C文件中引用了其他文件中定义的函数或者变量,编译器将无法找到这个函数或者变量的定义,从而给出该函数或者变量未定义的错误信息。
②static关键字用于全局变量的声明时,作用类似于函数的情况,这个全局变量的作用域将局限在声明该变量的c文件内部,这个c文件之外的代码将无法访问这个变量。编译的时候将会出现类似undeference to "xxx"的报错,它是找不到xxx的,因为使用static相当于进行了文件隔离。
3、那么再引申另一个问题,能不能在头文件中定义全局变量?
因为变量只能被定义一次,包含了头文件的源文件,都将会定义同样的全局变量,造成冲突,所以,头文件中不能定义全局变量。还有网友从节省内存的角度来分析,还得到了很多赞,我觉得解释的不对啊!详见c语言 中 为什么不将全局变量的定义放在头文件中
本博客的导火索,
就是因为在一个大的工程中,需要增加一个全局变量,一开始我是加在了某一个头文件中,然后报重复定义的错误,很显然,就是因为第2点中说的,由于这个头文件被多个源文件include,虽然在编译阶段可能能通过,但是在链接的时候就会出现重复定义的错误。
解决办法:
①处于尽可能的改动较少的文件的文件的原则,自己写一个头问价,文件内容就一条:全局变量的定义。这样的话,在需要使用的位置通过include这个头文件就可以了。但是,如果有多个源文件需要使用使用这个变量的话,这种情况也会发生重复定义的错误,因为include的过程就是复制的过程,那么很显然了,这个头文件被拷贝到了多个源文件中,链接时肯定会出现重复定义的错误啊。
而且,假设只有一个源文件需要这个全局变量,那么直接在这个源文件中定义全局变量就好了啊!还定义什么鬼头文件哦!
②假设工程中的多个源文件需要这个全局变量,那么你就任找一个源文件,把这个全局变量定义到这个源文件中,然后新建一个头文件,在里面进行extern 这个变量的声明,最后在需要使用这个全局变量的源文件中include你新建的头文件就OK了
如图所示: