强符号、弱符号和强引用、弱引用

强符号、弱符号和强引用、弱引用

强/弱符号和强/弱引用,主要用于描述静态语言中符号链接的问题,对于C/C++而言,编译器默认初始化的全局变量函数定义为强符号,未初始化的全局变量为弱符号。链接器在处理强符号和弱符号时,遵循以下几点规则。

  1. 强符号不允许被多次定义,即不同的文件中不能够存在相同符号定义。
  2. 强符号和弱符号同时存在时,使用强符号。
  3. 多个弱符号,选择占用内存最大的弱符号。

由上面的表述我们可以知道,C语言中extern其实就是对弱符号的另一种表达。符号的引用指的是对不同符号的使用,强引用和弱引用的主要区别在于,强引用限制符号必须已经定义,而弱引用符号则可以未定义,并且当引用的符号未定义时并不会报错,而是赋值为0。若符号可以用于开发程序插件,用户自定义相关数据等。
对于弱符号和强符号在C语言中的使用,可以参考下面的代码。


// main.c
extern void printLength();

static void hello() __attribute__((weakref("printHi")));

int gLength __attribute__((weak));

int
main(int argc, char **argv) {
  hello();

  printLength();
  gLength = 100;
  printLength();

  return 0;
}

// symbols.c
#include <stdio.h>

int gLength = 10;

void
printHi() {
  printf("Hello World!\n");
}

void
printLength() {
  printf("length=>%d\n", gLength);
}


从上面的代码中,可以看出hello以弱引用的方式引用符号printHi,还可以发现弱引用有点像别名,跟目标函数符号不同。而弱符号或者强符号,则限制在不同文件或模块中的符号是名称相同的。

转载于:https://my.oschina.net/taodf/blog/1934164

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值