
1 jiutai21 2018-01-29 14:22:14 +08:00 声明与定义的区别吧 |
2 ovear 2018-01-29 14:23:46 +08:00 LZ 是不是再找 extern |
3 sbw 2018-01-29 14:35:47 +08:00 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 |
5 sbw 2018-01-29 14:57:58 +08:00 |
6 ysc3839 2018-01-29 15:30:56 +08:00 via Android 定义了没使用,编译器就没编译吧? |
![]() | 7 xdlailai OP @xdlailai 找到答案了。 首先,所有的全局符号,在链接器这当做两类看待:a )强符号; b )弱符号。 强符号包括:已经初始化的全局变量(初始化和赋值是不同的,注意区分)、函数名; 弱符号包括:没有初始化的全局变量。 接着,链接器根据不同的符号组合,有不同的处理方式: a )强符号之间冲突,直接报错,链接失败。 b )强符号与弱符号之间冲突,强符号覆盖弱符号。 c )弱符号之间冲突,链接器会自己选一个来覆盖其他符号,选择方式各编译器不同。 |
8 MyPassWordis 2018-01-29 16:27:31 +08:00 “两个 C 文件都包含这个.h 文件,最后编译不会报重复定义的错,而且可以正常工作。” g++ 4.4 > multiple definition - - 楼主编译器用的什么 |
9 xdlailai OP @MyPassWordis gcc。。我也诧异为啥不报错。。以为肯定报错的。看来编译器之间差异不小。 |
10 chinawrj 2018-01-29 18:25:25 +08:00 via Android show me the code.你的眼睛或者描述肯定忽略了某些东西 |
11 monlite 2018-01-29 18:47:23 +08:00 你没有弄清楚定义和声明的区别。int a 相当于 extern int a,仅仅是声明,可以出现多次。而 int a = 1 是定义,只能出现一次。 |