__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))在声明和定义时的行为有所不同。
➡️

继续阅读