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