Keil> 编译器特有的功能 > 关键字和运算符 > __weak
2016-03-16 13:33
162 查看
__weak
此关键字指示编译器弱导出符号。
可以将
对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不会导致链接器将未解析的引用作为错误处理。
例如:
如果从编译为跳转或跳转链接指令的代码中对缺少的弱函数进行引用,则会:
将该引用解析为下一条指令的跳转。这实际上将跳转变为
将该跳转替换为
函数定义
使用
如果使用
函数和变量声明
在同一编译中,不能既弱使用又非弱使用函数或变量。例如,以下代码从
无法从定义某个函数或变量的同一编译中弱使用该函数或变量。以下代码从
链接器不会从库中加载函数或变量,除非其他编译非弱使用该函数或变量。如果一直没有解析引用,则假定其值为
函数定义
无法内联弱定义的函数。
注:此文章为转载,原文章地址:http://blog.sina.com.cn/s/blog_62d3426b0100g7n6.html
此关键字指示编译器弱导出符号。
可以将
__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
相关文章推荐
- CDMA子钟
- Xutils的get请求后,总是返回同样数据的问题解决方式
- Apache和Nginx防盗链
- 学习计划总结
- int string类型互转
- java线程虚假唤醒
- UVA 12298 (FFT)
- Struts2优缺点概述
- 公司技术管理角度看C++游戏程序员发展
- C语言#自动生成四则运算的编程
- 学习asp.net已经有3个月了,重新整理一下面向对象(一)
- 什么是JVM及其工作原理
- CodeBlocks中文乱码
- 内存泄漏测试命令及程序
- B-树、B+树、B*树详解
- 堆树(最大堆、最小堆)详解
- 【转】蓝牙物理链路类型:SCO和ACL链路
- js页面reload问题
- POJ 2406 kmp求循环节个数
- 开发自己的Openfire插件