Keil> 编译器特有的功能 > 关键字和运算符 > __weak
Posted cl1217982730
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keil> 编译器特有的功能 > 关键字和运算符 > __weak相关的知识,希望对你有一定的参考价值。
__weak
此关键字指示编译器弱导出符号。
可以将 __weak
关键字应用于函数和变量声明以及函数定义。
- 函数和变量声明
-
对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不会导致链接器将未解析的引用作为错误处理。
例如:
__weak void f(void); ... f(); // call f weakly
如果从编译为跳转或跳转链接指令的代码中对缺少的弱函数进行引用,则会:
-
将该引用解析为下一条指令的跳转。这实际上将跳转变为
NOP
。 -
将该跳转替换为
NOP
指令。
-
- 函数定义
-
使用
__weak
定义的函数将弱导出其符号。除非将相同名称的非弱定义函数链接到相同映像上,否则弱定义函数的行为与正常定义的函数类似。如果非弱定义函数和弱定义函数位于相同映像中,则会将对弱定义函数的所有调用解析为对非弱函数的调用。如果有多个可用的弱定义,链接器将选择其中的一个弱定义供所有调用使用。如果使用
__weak
声明函数,但随后没有使用__weak
对其进行定义,则此函数与非弱函数的行为相同。
使用 __weak
限定函数和变量声明以及函数定义时,存在一些限制。
- 函数和变量声明
-
在同一编译中,不能既弱使用又非弱使用函数或变量。例如,以下代码从
g()
和h()
中弱使用f()
:void f(void); void g() { f(); } __weak void f(void); void h() { f(); }
无法从定义某个函数或变量的同一编译中弱使用该函数或变量。以下代码从
h()
中非弱使用f()
:__weak void f(void); void h() { f(); } void f() {}
链接器不会从库中加载函数或变量,除非其他编译非弱使用该函数或变量。如果一直没有解析引用,则假定其值为
NULL
。但是,如果引用是指从代码中对位置无关节或缺少的__weak
函数的引用,则未解析的引用不是NULL
。 - 函数定义
-
无法内联弱定义的函数。
注:此文章为转载,原文章地址:http://blog.sina.com.cn/s/blog_62d3426b0100g7n6.html
以上是关于Keil> 编译器特有的功能 > 关键字和运算符 > __weak的主要内容,如果未能解决你的问题,请参考以下文章