概述
使用HiSilicon做项目,在系统客制初始化service init 中有定义了如下的函数:
HI_S32 _attribute_((weak)) HI_HAL_Service_PreInit(HI_VOID)
{
return HI_SUCCESS;
}
遂找到如下文章,解释很清楚;
我们不确定外部模块是否提供一个函数func,但是我们不得不用这个函数,即自己模块的代码必须用到func函数:
extern int func(void);
...................
int a = func();
if( a > .....)
{
..........
}
............
我们不知道func函数是否被定义了
这会导致2个结果:
1:外部存在这个函数func,并且EXPORT_SYMBOL(func),那么在我自己的模块使用这个函数func,正确。
2:外部其实不存在这个函数,那么我们使用func,程序直接崩溃。
所以这个时候,__attribute__((weak)) 派上了用场。
在自己的模块中定义:
int __attribute__((weak)) func(......)
{
return 0;
}
将本模块的func转成弱符号类型,如果遇到强符号类型(即外部模块定义了func),那么我们在本模块执行的func将会是外部模块定义的func。
如果外部模块没有定义,那么,将会调用这个弱符号,也就是在本地定义的func,直接返回了一个1(返回值视具体情况而定)
相当于增加了一个默认函数。
原理:连接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号。如果都不存在:静态链接,恭喜,编译时报错;动态链接,对不起,系统无法启动。
转载出处:http://blog.chinaunix.net/uid-7828352-id-4477460.html
最后
以上就是内向宝贝为你收集整理的_attribute_(weak)的用法的全部内容,希望文章能够帮你解决_attribute_(weak)的用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复