强符号、弱符号和强引用、弱引用
强/弱符号和强/弱引用,主要用于描述静态语言中符号链接的问题,对于C/C++而言,编译器默认初始化的全局变量和函数定义为强符号,未初始化的全局变量为弱符号。链接器在处理强符号和弱符号时,遵循以下几点规则。
- 强符号不允许被多次定义,即不同的文件中不能够存在相同符号定义。
- 强符号和弱符号同时存在时,使用强符号。
- 多个弱符号,选择占用内存最大的弱符号。
由上面的表述我们可以知道,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,还可以发现弱引用有点像别名,跟目标函数符号不同。而弱符号或者强符号,则限制在不同文件或模块中的符号是名称相同的。