弱符号与强符号,弱引用与强引用

1.弱符号与强符号

对C/C++而言,编译器默认函数和初始化了的全局变量为强符号。未初始化的全局变量为弱符号。此处弱符号与强符号均是针对定义来说的,不是针对符号的引用。也可以通过GCC的 “__attribute__((weak))”来定义任何一个强符号为弱符号

extern in ext;
int weak;
int strong = 1;
__attribute__((weak)) int weak2 = 1;

int main()
{
    return 0;
}

其中,强符号为:strong 与 main,弱符号为 :weak 与 weak2,而ext 即非强符号与非弱符号,因为它是一个外部变量的引用。针对强弱符号,链接器会根据下述规则来选择被多次定义的全局符号:

1.不允许强符号被多次定义。否则链接器报错:符号重复定义

2.如果符号在某个文件中是强符号,在其他文件中是弱符号,则选择强符号

3.如果一个符号在所有文件中都是弱符号,则选择其中占用空间最大的。如弱符号 weak 在 A 文件中定义为double,在文件B中定义为 int, 则在链接A,B时,weak 的大小为 double的大小。


2.弱引用与强引用

强引用:目标文件引用了外部符号,在链接时若未找到定义则报错;则对该外部符号的引用为强引用

弱引用:目标文件引用了外部符号,在链接时若未找到定义也不报错;则对该外部符号的引用为弱引用

对弱引用,编译器一般默认其值为0,在GCC中,使用“__attribute__((weak))”来声明对一个外部符号的引用为弱引用。通常对弱引用的使用方式如下:

__attribute__((weak)) void func();

int main()
{
      if(foo) foo();
}


3.弱符号与弱引用的作用:

如:库中定义的弱符号可以被用户定义的强符号覆盖,从而使程序可以使用自己定义版本的库函数

如:库中定义的某些扩展功能模块的引用定义为弱引用,当我们将扩展模块与程序链接在一起时,正常运行;当我们去掉某些扩展模块时,程序也正常链接,只是缺少了相应功能




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值