【C++】强引用和弱引用

链接器处理强引用和弱引用的过程几乎是一样的,只是对于未定义的弱引用,链接器不认为它是一个错误,一般默认其为 0(地址为 0),或者是一个特殊的值,以便程序代码能够识别。

__attribute__((weak)) extern int a;

printf("a = %d\n", a);

我们可以将它编译成一个可执行文件,GCC 并不会报链接错误。但是当程序运行时,输出&a: 0, func: 0后就会发生段错误(Segment Fault),这是因为符号 a 和 func 的地址都为 0,这个地址是禁止访问的。
 

 

代码中需要判断的是地址,不是值,所以变量 a 前面需要加&;而函数名本身就表示地址,所以 func 前边不需要&

 

 

弱引用和强引用非常利于程序的模块化开发,我们可以将程序的扩展模块定义为弱引用,当我们将扩展模块和程序链接在一起时,程序就可以正常使用;如果我们去掉了某些模块,那么程序也可以正常链接,只是缺少了某些功能,这使得程序的功能更加容易裁剪和组合。

你可能感兴趣的:(C语言与科学计算)