未定义的引用_强引用和弱引用

所谓引用(Reference),是指对符号的使用。在下面的代码中:

int a = 100, b = 200, c;

c = a + b;

第一行是符号定义,第二行是符号引用。目前我们所看到的符号引用,在所有目标文件被链接成可执行文件时,它们的地址都要被找到,如果没有符号定义,链接器就会报符号未定义错误,这种被称为强引用(Strong Reference)。与之相对应的还有一种弱引用(Weak Reference),如果符号有定义,就使用它对应的地址,如果没有定义,也不报错。链接器处理强引用和弱引用的过程几乎是一样的,只是对于未定义的弱引用,链接器不认为它是一个错误,一般默认其为 0(地址为 0),或者是一个特殊的值,以便程序代码能够识别。在变量声明或函数声明的前面加上__attribute__((weak))就会使符号变为弱引用。比如下面这段代码:

#include __attribute__((weak)) extern int a;__attribute__((weak)) extern void func();  //也可以不写externint main(){    printf("&a: %d, func: %d\n", &a, func);    printf("a = %d\n", a);    func();    return 0;}

我们可以将它编译成一个可执行文件,GCC 并不会报链接错误。但是当程序运行时,输出&a: 0, func: 0后就会发生段错误(Segment Fault),这是因为符号 a 和 func 的地址都为 0,这个地址是禁止访问的。

一个改进的例子是:

#include __attribute__((weak)) extern int a;__attribute__((weak)) extern void func();int main(){    printf("&a: %d, func: %d\n", &a, func);    if(&a){        printf("a = %d\n", a);    }else{        printf("a is undefined!\n");    }    if(func){        func();    }else{        printf("func() is undefined!\n");    }    return 0;}

运行结果:

&a: 0, func: 0
a is undefined!
func() is undefined!

代码中需要判断的是地址,不是值,所以变量 a 前面需要加&;而函数名本身就表示地址,所以 func 前边不需要&。弱引用和强引用非常利于程序的模块化开发,我们可以将程序的扩展模块定义为弱引用,当我们将扩展模块和程序链接在一起时,程序就可以正常使用;如果我们去掉了某些模块,那么程序也可以正常链接,只是缺少了某些功能,这使得程序的功能更加容易裁剪和组合。

98f7e5633e4dac974a4be19ccecc08bb.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值