问一个 C 语言中全局变量的问题~

2018 年 1 月 29 日
 xdlailai
我有一个.h 文件,文件中定义一个全局变量 int a ;
两个 C 文件都包含这个.h 文件,最后编译不会报重复定义的错,而且可以正常工作。
如果我把 h 文件里的 int a ;改为 int a=1;就可以报出重复定义的错。
搜索了半天,也没找到为啥。v 友帮解释下吧~多谢。
2480 次点击
所在节点    问与答
11 条回复
jiutai21
2018 年 1 月 29 日
声明与定义的区别吧
ovear
2018 年 1 月 29 日
LZ 是不是再找 extern
sbw
2018 年 1 月 29 日
with the exception that uninitialized variables tentatively go in the common (or bss) section and can be multiply "defined".

https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html
xdlailai
2018 年 1 月 29 日
@sbw 我也查到这个,说不初始化的变量会定义到 bss 段。但是还不是太理解
sbw
2018 年 1 月 29 日
ysc3839
2018 年 1 月 29 日
定义了没使用,编译器就没编译吧?
xdlailai
2018 年 1 月 29 日
@xdlailai
找到答案了。
首先,所有的全局符号,在链接器这当做两类看待:a )强符号; b )弱符号。
强符号包括:已经初始化的全局变量(初始化和赋值是不同的,注意区分)、函数名;
弱符号包括:没有初始化的全局变量。
接着,链接器根据不同的符号组合,有不同的处理方式:
a )强符号之间冲突,直接报错,链接失败。
b )强符号与弱符号之间冲突,强符号覆盖弱符号。
c )弱符号之间冲突,链接器会自己选一个来覆盖其他符号,选择方式各编译器不同。
MyPassWordis
2018 年 1 月 29 日
“两个 C 文件都包含这个.h 文件,最后编译不会报重复定义的错,而且可以正常工作。”

g++ 4.4 > multiple definition

- - 楼主编译器用的什么
xdlailai
2018 年 1 月 29 日
@MyPassWordis gcc。。我也诧异为啥不报错。。以为肯定报错的。看来编译器之间差异不小。
chinawrj
2018 年 1 月 29 日
show me the code.你的眼睛或者描述肯定忽略了某些东西
monlite
2018 年 1 月 29 日
你没有弄清楚定义和声明的区别。int a 相当于 extern int a,仅仅是声明,可以出现多次。而 int a = 1 是定义,只能出现一次。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/426791

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX