__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来声名函数,当外部没有定义该函数时就会报错,导致编译不过。

本文转自 https://blog.csdn.net/weixin_42031299/article/details/116269010,如有侵权,请联系删除。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值