__weak是一个c/c++编译器关键字,用于定义一个弱化符号。弱化符号是一种在链接阶段可以被覆盖的符号,允许多个同名符号存在于不同的目标文件中,而不会产生冲突。
人话版:
如果这个关键字用在函数定义上面,一般情况下和一般函数没有两样。但是当有一个同名函数但是不带__weak被定义时,所有对这个函数的调用都是指向后者(不带__weak那个),如果有两个一样的函数都用了__weak,那么真正调用哪个,就要看连接器了。
当一个符号被声明为__weak时,它具有两个特性:
1、如果该符号在某个目标文件中被定义,那么这个定义将成为默认实现,并且可以在链接器阶段被覆盖
2、如果该符号在某个目标文件中未被定义,则该符号的默认实现将为NULL
\weak和__attribute__((weak))都是定义弱化符号的关键字或属性,作用一致
在GCC编译器中,__weak是一个预定义的关键字,用于标记弱化符号。而_attribuate_((weak))是一种编译器特性,可以通过编译器属性来指示一个符号为弱化符号
举例如下:
1 | // weak.c |
执行结果如下:
1 | Weak variable: 20 |