__weak 和 __attribute__((weak)) 关键字的使用
💡
原文中文,约4800字,阅读约需12分钟。
📝
内容提要
在Keil编译器中,__weak关键字的函数没有起作用。在ARM中,__weak关键字可以用于函数和变量的声明和定义,声明时指定extern对象声明,引用时不会导致链接器对未解析的引用报错。__attribute__((weak))关键字也可以声明弱函数和弱变量,用于定义的函数弱输出其符号。
🎯
关键要点
- __weak关键字在Keil编译器中未能正常工作。
- __weak关键字在ARM中用于函数和变量的声明和定义。
- __attribute__((weak))关键字也可用于声明弱函数和弱变量。
- GCC中,__weak关键字是一个扩展关键字,使用__attribute__指定属性。
- ARM编译器支持与GCC相同的__attribute__关键字。
- 在GCC中,__attribute__((weak))修饰的符号称为弱符号。
- ARM中没有弱符号和强符号的概念,只有弱引用和非弱引用。
- 非弱引用必须通过定义来解决,若找不到则链接器报错。
- 弱引用不会导致链接器加载对象,可能被标记为未使用而删除。
- __weak关键字可用于函数和变量的声明及定义。
- __weak声明的引用不会导致链接器报错,若找不到定义则替换为NOP指令。
- 弱定义的函数行为类似于正常定义,除非有同名非弱定义存在。
- 函数或变量不能在同一编译中同时弱和非弱使用。
- 弱函数不能是内联函数。
- __attribute__((weak))在声明和定义时的使用更灵活。
- __weak和__attribute__((weak))在声明和定义时的行为有所不同。
➡️