浅谈C语言中的强符号、弱符号、强引用和弱引用
首先我表示很悲剧,在看《程序员的自我修养--链接、装载与库》之前我竟不知道C有强符号、弱符号、强引用和弱引用。在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望高人指点。
首先我们看一下书中关于它们的定义。
引入场景:(1)文件A中定义并初始化变量i(inti=1),文件B中定义并初始化变量i(inti=2)。编译链接A、B时会报错b.o:(.data+0x0):multipledefinitionof`i';a.o:(.data+0x0):multipledefinitionof`i'。(2)在文件C中定义并初始化两个变量i(inti=1;inti=2),编译链接时会报错c.c:2:5:error:redefinitionof‘i';c.c:1:5:note:previousdefinitionof‘i'washere。
强符号:像场景中这样的符号定义被称为强符号,对于C/C++来说,编译器默认函数和初始化的全局变量为强符号。
弱符号:接上文,为初始化的全局变量为弱符号。
编译器关于强弱符号的规则有:(1)强符号不允许多次定义,但强弱可以共存;(2)强弱共存时,强覆盖弱;(3)都是弱符号时,选择占用空间最大的,如选择double类型的而不选择int类型的。
由以上定义所以有我之前没有想到的场景:
代码a.c:
1inti=2;
代码b.c:
#include<stdio.h>
inti; intmain(intargc,char**argv) { printf("i=%d\n",i); return0; }