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

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

强/弱符号和强/弱引用,主要用于描述静态语言中符号连接的问题,对于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,还能够发现弱引用有点像别名,跟目标函数符号不一样。而弱符号或者强符号,则限制在不一样文件或模块中的符号是名称相同的。code

相关文章
相关标签/搜索