__attribute__((weak)):弱引用,可以不实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了__attribute__((weak)):弱引用,可以不实现相关的知识,希望对你有一定的参考价值。
参考技术A // 变量加上weak时,是弱符号。函数加上weak时,是弱引用,可以不实现。// 给函数加上weak属性时,即使函数没定义,函数被调用也可以编译成功。
//当有两个函数同名时,则使用强符号(也叫全局符号,即没有加weak的函数)来代替弱符号(加weak的函数)。
int func() __weak;
int main()
func();
__attribute__((weak))介绍以及用法
什么是强符号和弱符号?
在c语言中,函数和初始化的全局变量是强符号,未初始化的全局变量是弱符号。强符号和弱符号的定义是连接器用来处理多重定义符号的,它的规则是:不允许多个强符号;如果一个强符号和一个弱符号,这选择强符号;如果多个弱符号,则任意选一个。
使用__attribute__((weak))的场景
A,B两个模块,A模块调用了,但是不确定B模块是否提供了函数,但是又不得不调用,这个时候在A模块中再申明一个弱符号函数,即用weak,如果外部提供了调用外部的,如果没提供调用申明的。在工作当中就是在保证在没有链接某个库时能编译通过。假设现在有一个库,支持a、b、c三种模式,并且同时只能有一种模式生效,可以适配三种类型的设备。如果想要a模式,那就没有必要去链接b、c模式依赖的库,像调用普通函数一样,肯定会报函数未定义错误,因为你没有链接相关库。这时我们只需要把函数在本模块声名时都加上__attribute__((weak)),这样链接就可以通过。(在这种情况,必须得确保a模式下,程序运行中不会调用b、c模式的函数,否者会造成程序崩溃,因为你没有链接相关库,函数是没有定义的,只是欺骗编译器让编译通过)
attribute((weak))的作用:
弱符号函数使模块的函数转换为弱符号类型,连接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号。只存在弱符号,则选择弱符号。
#示例代码:
#include <stdio.h>
void __attribute__((weak)) func();
//extern void func();
void main()
{
if(func != NULL)
{
func();
}
}
代码解析:
当我们用__attribute__((weak))修饰func()函数后,func就是一个弱符号。不管外部是否定义了func()我们都可以链接通过,当外部定义了就调用外部的func函数,当外部没有定义时就调用本模块的func函数。但实际上本模块并没有定义func函数,所以在调用时我们判断一下函数指针是否为空,以免造成段错误。如果我们用extern来声名函数,当外部没有定义该函数时就会报错,导致编译不过。
以上是关于__attribute__((weak)):弱引用,可以不实现的主要内容,如果未能解决你的问题,请参考以下文章