__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))介绍以及用法相关推荐
- __attribute__((weak)) 用法
我们不确定外部模块是否提供一个函数func,但是我们不得不用这个函数. 一.问题声明 extern int func(void); //声明函数,告诉编译器不要管 .................. ...
- ARM 之十一__weak 和 __attribute__((weak)) 关键字的使用
今天在使用 Keil (主要是 armcc 编译器)编译代码(华大的 MCU 驱动库hc32f46x_interrupts.h / c)的时候遇到了有 __weak 关键字的函数不起作用的问题,甚 ...
- __weak 和 __attribute__((weak)) 关键字的使用
今天在使用 Keil (主要是 armcc 编译器)编译代码(华大的 MCU 驱动库hc32f46x_interrupts.h / c)的时候遇到了有 __weak 关键字的函数不起作用的问题,甚是奇 ...
- C语言:__attribute__((weak)) 弱符号与__attribute__ ((weakref())弱引用
C语言中的__attribute__((weak)) 与 __attribute__((weakref()) 引言:最近在看 linux 中一些驱动代码.驱动代码中为了实现程序的扩展性和兼容性用了很多 ...
- Java 动态代理介绍及用法
Java 动态代理介绍及用法 一,静态代理模式的特点 在之前的文章中 java代理模式 已经介绍里java里的(静态)代理模式 下面是上文静态代理类的例子: public class ProxyBea ...
- Java中BigDecimal类介绍及用法
Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...
- chrome介绍与用法
chrome介绍与用法 chrome介绍与用法 1. 认识devTools Elements 面板 console控制面板 Sources 资源面板 chrome介绍与用法 1. 认识devTools ...
- __attribute__((weak)):弱引用,可以不实现
#include <stdio.h>#define __weak __attribute__((weak)) //变量加上weak时,是弱符号.函数加上weak时,是弱引用,可以不实现. ...
- __attribute__((weak))是什么意思
最近在阅读tcmalloc代码时发现使用了很多__attribute__((weak)),上网搜了以下有所了解. 弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak ...
最新文章
- 无盘工作站 服务器 性能,无盘工作站与有盘工作站比较,突出的优势有哪些?...
- 安装 Windows 7 64位系统 相关注意事项
- 为什么说 Java 是按值传递的?
- leetcode 145 --- 二叉树后序遍历
- HTML+CSS+JS实现 ❤️响应式的幸运大转盘❤️
- UVA - 699 The Falling Leaves
- 高并发高可用系统的常见应对策略
- find的详细用法及其例子
- java各层_java后台各个层理解
- 分享一些前端优质的掘金小册,学完技术感觉已经超神了
- Mandriva本地安装
- PAT.1143 Lowest Common Ancestor
- Install VirtualBox Guest Additions for elementary os
- axure元件制作-常用开关
- 2009年经典语录雷人总汇
- 网络——介质访问控制
- 计算机直接切换到桌面,屏幕如何快速切换桌面
- 隐马尔科夫(HMM)模型
- 1985年全国计算机编程大赛,关于举办2021年“中国高校计算机大赛-团体程序设计天梯赛”校内选拔赛的通知...
- 飞思卡尔智能车 电机PID
热门文章
- Linux那些事儿之我是SCSI硬盘(6)三座大山(三)
- Linux批量创建文件的命令,Linux中常用的批量操作文件命令
- PyCharm使用venv虚拟环境
- 如何将CAD图纸复制到另一张图纸上?
- C++11学习笔记: auto关键字
- php和shell脚本语言,将PHP作为Shell脚本语言使用_PHP教程
- 【Rust日报】 2019-06-10:「嵌入式Rust」使用STM32 Blue Pill在Apache Mynewt上托管嵌入式Rust应用程序...
- 【C#项目】图书馆管理系统-WinForm+MySQL
- 全球及中国工业节能行业“十四五”动态调研及投资可行性研究报告2021-2027年
- Qt实现文件拷贝递归实现