嵌入式C语言(八)

news2025/4/12 7:36:20

继续来看看新的属性:weak
这个符号知道是弱,但是这个是干嘛的呢?我们先来学习一下强符号和弱符号

强符号和弱符号

GNU C通过weak属性声明,**可以将一个强符号转换为弱符号。**使用方法如下。

void __attribute__((weak)) func(void);
int num __attribute__((weak))

一个程序中,无论是变量名,还是函数名,在编译器的眼里,就是一个符号而已。符号可以分为强符号和弱符号。

● 强符号:函数名,初始化的全局变量名。

● 弱符号:未初始化的全局变量名。

在一个工程项目中,对于相同的全局变量名、函数名,我们一般可以归结为下面3种场景。

● 强符号+强符号。

● 强符号+弱符号。

● 弱符号+弱符号。

强符号和弱符号主要用来解决在程序链接过程中,出现多个同名全局变量、同名函数的冲突问题。一般我们遵循下面3个规则。

● 一山不容二虎。

● 强弱可以共处。

● 体积大者胜出。

在一个项目中,不能同时存在两个强符号。如果你在一个多文件的工程中定义两个同名的函数或全局变量,那么链接器在链接时就会报重定义错误。

但是在一个工程中允许强符号和弱符号同时存在,如你可以同时定义一个初始化的全局变量和一个未初始化的全局变量,这种写法在编译时是可以编译通过的。

编译器对于这种同名符号冲突,在做符号决议时,一般会选用强符号,丢掉弱符号。

还有一种情况就是,在一个工程中,当同名的符号都是弱符号时,那么编译器该选择哪个呢?谁的体积大,即谁在内存中的存储空间大,就选谁。

不建议在一个工程中定义多个不同类型的同名弱符号,编译的时候可能会出现各种各样的问题。

在一个工程中,也不能同时定义两个同名的强符号,否则就会报重定义错误。

可以使用GNU C扩展的weak属性,将一个强符号转换为弱符号。

链接器对于同名函数冲突,同样遵循相同的规则。函数名本身就是一个强符号,在一个工程中定义两个同名的函数,编译时肯定会报重定义错误。

那弱符号能干嘛呢?

在一个源文件中引用一个变量或函数,当编译器只看到其声明,而没有看到其定义时,编译器一般编译不会报错:编译器会认为这个符号可能在其他文件中定义。

在链接阶段,链接器会到其他文件中找这些符号的定义,若未找到,则报未定义错误。

当函数被声明为一个弱符号时,会有一个奇特的地方:当链接器找不到这个函数的定义时,也不会报错。编译器会将这个函数名,即弱符号,设置为0或一个特殊的值。只有当程序运行时,调用到这个函数,跳转到零地址或一个特殊的地址才会报错,产生一个内存错误。

为了防止函数运行出错,我们可以在运行这个函数之前,先进行判断,看这个函数名的地址是不是0,然后决定是否调用和运行,这样就可以避免段错误了。

弱符号的这个特性,在库函数中应用得很广泛。如你在开发一个库时,基础功能已经实现,有些高级功能还没实现,那么你可以将这些函数通过weak属性声明转换为一个弱符号。通过这样设置,即使还没有定义函数,我们在应用程序中只要在调用之前做一个非零的判断就可以了,并不影响程序的正常运行。等以后发布新的库版本,实现了这些高级功能,应用程序也不需要进行任何修改,直接运行就可以调用这些高级功能。

(我还没做好,低调点,等我做好了就理直气壮了)

还有个alias

这个属性很简单,主要用来给函数定义一个别名。

在这里插入图片描述
在Linux内核中,你会发现alias有时会和weak属性一起使用。如有些函数随着内核版本升级,函数接口发生了变化,我们可以通过alias属性对这个旧的接口名字进行封装,重新起一个接口名字。
在这里插入图片描述

这不是就不用修改函数了,如果我们在main.c中新定义了f()函数,那么当main()函数调用f()函数时,会直接调用main.c中新定义的函数;当f()函数没有被定义时,则调用__f()函数。

这些逻辑还是有点意思

  • 资料:《嵌入式C语言自我修养》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenGL手册15】 多光源

目录 一、说明二、定向光三、点光源四、合并结果练习 一、说明 我们在前面的教程中已经学习了许多关于OpenGL中光照的知识,其中包括冯氏着色(Phong Shading)、材质(Material)、光照贴图(Lighting Map)以及不同种类的投光物(Light Caster)。在这一节中,我…

回收站删除的文件怎么恢复?这3个方法可行!

“求助!回收站删除的文件还有没有机会恢复呀?我不小心将回收站清空了,但是有一些很重要的文件还在里面,应该怎么恢复它们啊!” 在使用电脑的过程中,我们难免会遇到误删文件的情况。而当文件被删除并清空回收…

c++: 引用能否替代指针? 详解引用与指针的区别.

文章目录 前言1. 引用和指针的最大区别:引用不能改变指向2. 引用和指针在底层上面是一样的3. 引用和指针在sizeof面前大小不同4. 有多级指针,没有多级引用5.引用是引用的实体,指针会向后偏移同一个类型的大小 总结 前言 新来的小伙伴如果不知道引用是什么?可以看我的上一篇文…

Kubernetes | 起源 | 组件详解

起源 起源: Kubernetes(常简称为K8s)起源于Google内部的Borg项目,是一个开源的容器编排引擎,于2014年首次对外发布。 Google Borg Google Borg 是 Google 内部开发和使用的大规模集群管理系统,用于管理和运…

锐捷 EWEB auth 远程命令执行漏洞复现

一、漏洞信息 漏洞名称:锐捷 EWEB auth 远程命令执行漏洞 漏洞类别:远程代码执行 风险等级:高危 二、漏洞描述 锐捷睿易是锐捷网络针对商业市场的子品牌。拥有易网络、交换机、路由器、无线、安全、云服务六大产品线,解决方案涵盖商贸零售、酒店、KTV、网吧、监控安防…

GPT出现Too many requests in 1 hour. Try again later.

换节点 这个就不用多说了,你都可以上GPT帐号了,哈…… 清除cooki 然后退出账号,重新登录即可

KBL610-ASEMI开关电源专用KBL610

编辑:ll KBL610-ASEMI开关电源专用KBL610 型号:KBL610 品牌:ASEMI 封装:KBL-4 最大重复峰值反向电压:1000V 最大正向平均整流电流(Vdss):6A 功率(Pd):中小功率 芯片个数:4 …

encoding和embedding的区别

本文作者: slience_me 文章目录 encoding和embedding的区别EmbeddingEncoding总结 encoding和embedding的区别 “Embedding” 和 “Encoding” 是两个在计算机科学和机器学习领域中常用的术语,它们虽然有些相似,但指代的概念和用途有所不同。…

国创证券|lpr下调25个基点是多少?lpr下调对股市债市有什么影响?

lpr是借款市场报价利率,其间lpr下调25个基点是指lpr利率下降0.25%,比方,下调之前五年期以上的lpr为4.2%,下调25个基点之后,变为3.95%。 lpr下调对股市债市存在以下影响: 1、券商股 借款利率下降&#xf…

发现创作灵感的聚集地:乐歌M9G与M9S升降办公台对比解析

在现代工作环境中,全天待在桌前的时间已经超过了其他的项目,尤其是以编程开发、动画设计为主的互联网从业者,工作量的增加,会导致颈椎和腰椎僵硬,根据人工工程学提出的人与环境之间的协调关系,对于上班一族…

ssm蛋糕甜品商城系统(程序+文档+数据库)

** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 一、研究背景…

场的概念---数量场(标量场)和矢量场介绍理解

目录 一、场的概念 二、场的分类 三、数量场(标量场)的等值面 四、矢量场中的矢量线 矢量线方程推导: 一、场的概念 场在数学上是指一个向量到另一个向量或数的映射。场指物体在空间中的分布情况。场是用空间位置函数来表征的。在物理学…

C#集合和数据结构,随笔记录没空排版,,,

C#集合和数据结构 System.Collections命名空间包含接口和类,这些接口和类定义各种对象(如列表/链表、位数组、哈希表、队列和堆栈)的集合 System.Collections.Generic命名空间: 所有集合都直接或间接基于ICollection接口 列表类集…

网络通信另个角度的认识(进程间通信),端口号(为什么要有,和pid的关系,如何封装,和进程的定位原理+对应关系)客户端如何拿到服务端的port

目录 另一个角度认识网络通信 端口号 引入 -- 为什么要有端口号 问题 解决 端口号和pid 举例 介绍 分类 知名端口 注册端口 动态端口 客户端如何知道服务端的端口号 封装端口号 定位原理 进程和端口号的对应关系 数据如何被上层进程读到 另一个角度认识网络…

抽样算法——【数据科学与工程算法基础】

一、前言 这是课程的第二章节——抽样算法,主要分为三类。 详情可参考: 数据科学的算法基础——学习记录跳转中心 二、正篇 1.系统抽样 课本只介绍了最简单的——等距抽样。 直线等距抽样(Nn*k):即总体个数可以被抽…

webgl instance 绘制

webgl instance 绘制 效果: key1: 创建实例缓存 function createMesh() {for (let i 0; i < NUM_CUBE; i) {const angle i * 2 * Math.PI / NUM_CUBE;const x Math.sin(angle) * RADIUS;const y 0;const z Math.cos(angle) * RADIUS;cubes[i] {scale: new THREE.V…

从零开始实现ORB_SLAM2编译与运行

文章目录 前言一、前期准备二、库安装1.engin库安装方法1&#xff1a;apt安装方法2&#xff1a;源码安装 2.Pangolin库安装3.openCV源码安装 三、build编译四、测试五、ROS安装六、build-ros编译七、测试总结 前言 ORB_SLAM2作为一种优秀的开源VSLAM解决方案&#xff0c;以其高…

高浓度纸浆废水如何处理达标排放

在纸浆生产过程中&#xff0c;高浓度纸浆废水是一个常见的环境污染源&#xff0c;其处理对于环境保护和可持续发展至关重要。为了实现高浓度纸浆废水的达标排放&#xff0c;必须采用一系列专业的处理技术&#xff0c;以确保废水处理的高效性和环境友好性。 首先&#xff0c;通过…

Oracle之ADG与DG的区别?

在上云后的Oracle数据灾备场景中&#xff0c;我们经常听到DBA迁移工程师讲到“在这个项目中用ADG进行数据实时备份&#xff0c;ADG比DG更好&#xff01;”。究竟ADG作Oracle数据灾备的优势在什么地方&#xff1f; 一、ADG主要解决了DG时代读写不能并行的问题 DG时代的数据同步…

Kutools For Excel | 新增 300+ 高级功能

Kutools For Excel 是一个便捷的 Excel 插件&#xff0c;具有 300 多种高级功能&#xff0c;可将各种复杂的任务简化为在 Excel 中的几次单击。 功能强大且用户友好的加载项将为 Excel 用户节省大量工作时间&#xff0c;并大大提高工作效率。支持 Excel 2021 / 2019 / 2016 / …