嵌入式 C 语言进阶小技巧,弱符号和弱引用

2023-05-16

已剪辑自: https://mp.weixin.qq.com/s/7gBn4CB-PwiJBfM0v57-xA

我是老温,一名热爱学习的嵌入式工程师
关注我,一起变得更加优秀!
     
       
                                        
       
                  
           工程师老温                                         
           
           
             ,赞              17                                   

__attribute__ 是一个编译器指令,其实是 GNU C 的一种机制,本质是一个编译器的指令,在声明的时候可以提供一些属性,在编译阶段起作用,来做多样化的错误检查和高级优化。

用于在 C,C++,Objective-C 中修饰变量、函数、参数、方法、类等。

合理使用 __attribute__ 有什么好处?

  • 给编译器提供上下文,帮助编译器做优化,合理使用可以收到显著的优化效果。
  • 编译器会根据 __attribute__ 产生一些编译警告,使代码更规范。
  • 给代码阅读者提供必要的注解,助其理解代码意图。

总之,****__attribute__ 起到了给编译器提供上下文的作用,如果错误的使用 __attribute__ 指令,因为给编译器提供了错误的上下文,由此引起的错误通常很难被发现。

强符号和弱符号

在同一作用域下不能定义同一个变量或函数,很多C语言学习者都理所当然地这么认为。

这个其实是是有所偏颇的,GNU C对标准C语言进行了扩展,在GCC中,对于符号(在编译时,变量和函数都被抽象成符号)而言,存在着强符号和弱符号之分

是的,是否支持这个特性是由不同的C语言标准决定的。

对于C/C++而言,编译器默认函数和已初始化的全局变量为强符号,而未初始化的全局变量为弱符号。

在编程者没有显示指定时,编译器对强弱符号的定义会有一些默认行为,同时开发者也可以对符号进行指定,使用"attribute((weak))"来声明一个符号为弱符号。

定义一个相同的变量,当两者不全是强符号时,gcc在编译时并不会报错,而是遵循一定的规则进行取舍:

  • 当两者都为强符号时,重复定义的报错:redefinition of 'xxx'
  • 当两者为一强一弱时,选取强符号的值
  • 当两者同时为弱时,选择其中占用空间较大的符号,这个其实很好理解,编译器不知道编程者的用意,选择占用空间大的符号至少不会造成诸如溢出、越界等严重后果。

在默认的符号类型情况下,强符号和弱符号是可以共存的,类似于这样:

int x;
int x = 1;

编译不会报错,在编译时x的取值将会是1.

注意,这里可以使用__attribute__((weak))将强符号转换为弱符号,却不能与一个强符号共存,类似于这样:

int __attribute__((weak)) x = 0;
int x = 1;

编译器将报重复定义错误。

强引用和弱引用

除了强符号和弱符号的区别之外,GNUC还有一个特性就是强引用和弱引用。

我们知道的是,编译器在编译阶段只负责将源文件编译成目标文件(即二进制文件),然后由链接器对所有二进制文件进行链接操作。

编译器默认所有的变量和函数为强引用,同时编程者可以使用__attribute__((weakref))来声明一个函数。

注意这里是声明而不是定义,既然是引用,那么就是使用其他模块中定义的实体,对于函数而言,我们可以使用这样的写法:

__attribute__((weakref)) void func(void);

,然后在函数中调用func(),如果func()没有被定义,则func的值为0,如果func被定义,则调用相应func,在《程序员的自我修养》这本书中有介绍,它是这样写的:

__attribute__((weakref)) void func(void);
void main(void)
{
    if(func) {func();}
}

但是在现代的编译系统中,这种写法却是错误的,编译虽然通过(有警告信息),但是却不正确:

warning: ‘weakref’ attribute should be accompanied with an ‘alias’ attribute [-Wattributes]

警告显示:weakref需要伴随着一个别名才能正常使用

强/弱符号和强/弱引用的作用

这种弱符号、弱引用的扩展机制在库的实现中非常有用。

我们在库中可以使用弱符号和弱引用机制,这样对于一个弱符号函数而言,用户可以自定义扩展功能的函数来覆盖这个弱符号函数。

同时我们可以将某些扩展功能函数定义为弱引用,当用户需要使用扩展功能时,就对其进行定义,链接到程序当中。

如果用户不进行定义,则链接也不会报错,这使得库的功能可以很方便地进行裁剪和组合。

注意:C标准里根本没有提到强、弱符号。这只是GCC这个实现定义的特性,在MS C编译器里是不存在这个概念的。

版权声明:本文来源网络,版权归原作者所有。版权问题,请联系删除。

我是老温,一名热爱学习的嵌入式工程师
关注我,一起变得更加优秀!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式 C 语言进阶小技巧,弱符号和弱引用 的相关文章

  • 硬件接口和软件接口

    文章目录 硬件接口IDESCSISATA光纤通道游戏设备RAID卡USBMD设备MP3视频音频 软件接口Java里的接口面向对象的接口 聊聊软件接口1 什么是接口2 诞生3 早期 xff08 1950 1970 xff09 4 快速发展 x
  • 有关C语言,定时器,周期任务的一些文章汇总

    测试C语言中打印一句 hello world需要耗费多少时间 C C 43 43 开源库 适合嵌入式的定时器调度器 C语言实现的多线程定时器 C语言操作时间函数 xff0c 实现定时执行某个任务小程序 C语言实现任务调度与定时器 Linux
  • SCADE简单了解

    随着新能源三电 智能驾驶等新技术的应用 xff0c 汽车中衍生出很多的安全零部件 xff0c 如BMS VCU MCU ADAS等 xff0c 相应的软件在汽车中的比重越来越大 xff0c 随之而来的安全性 可靠性要求也越来越高 ANSYS
  • 冯诺依曼体系结构与操作系统

    文章目录 详解冯诺依曼体系结构与操作系统前言1 简要背景介绍2 五大部件介绍3 细节解释4 举例理解冯诺依曼机中数据走向 二 全面认识操作系统1 操作系统的概念2 计算机系统 比对 银行系统3 深入认识 管理 xff1a 5 操作系统存在的
  • ADAS系统安全架构设计及安全等级的分解

    已剪辑自 https mp weixin qq com s PaFQDUR iOnEeueYQ82m w 笔者从事功能安全领域工作八年有余 xff0c 结合个人经验分享一下对系统安全架构设计的理解 xff0c 希望能够解决部分同行对于安全架
  • 汽车电子电气架构演进驱动主机厂多重变化

    已剪辑自 https mp weixin qq com s P56MaFODVc eZ4JEOVJvfA 汽车电子电气架构 xff08 EEA xff0c Electrical Electronic Architecture xff09 把
  • 编写可移植C/C++程序的要点

    以前做过两年C C 43 43 程序移植工作 xff0c 从Win32平台移植到Linux平台 大约有上百万行C C 43 43 代码 xff0c 历时一年多 在开发Win32版本时 xff0c 已经强调了程序的可植性 xff0c 无奈Wi
  • 智能座舱域控制器技术发展趋势分析

    已剪辑自 https mp weixin qq com s ajmpg7ThTUBerLvb2Bng9g 提到座舱域控制器用的主控SoC芯片 xff0c 大家第一个会想到应该就是高通的SA8155P 目前 xff0c 在主机厂新上市的中高端
  • 一个单片机驱动LCD编程思路

    文章目录 LCD种类概述TFT lcdCOG lcdOLED lcd 硬件场景预备知识面向对象驱动与设备分离 LCD到底是什么LCD驱动框架代码分析GUI和LCD层驱动IC层接口层总体流程 用法和好处字库声明 已剪辑自 https mp w
  • TinyFlashDB:一种超轻量的可纠错的通用单片机Flash存储方案

    文章目录 一 TinyFlashDB设计理念二 TinyFlashDB使用示例三 TinyFlashDB API介绍四 TinyFlashDB设计原理五 TinyFlashDB移植和配置六 移植到STM32单片机 已剪辑自 https mp
  • VR游戏交互开发的一些体验

    VR游戏交互开发的一些体验 本文主要写Unity开发手游过程中VR交互输入控制的一些浅薄的经验交互方面 xff0c 头控和视线按钮依然较为主流 xff0c 可以获得传感器数据来获得输入除了实体按钮输入之外还可以探索其他交互方式 xff0c
  • FTP、FTPS和SFTP的简介与区别

    FTP FTPS和SFTP的简介与区别 参考链接 xff1a https blog csdn net Mr Fan97 article details 119539189 FTP FTPS和SFTP简介 FTP FTP 即 文件传输协议 x
  • 基于功能安全的车载计算平台开发:硬件层面

    作为车载智能计算平台功能软件与系统软件的载体 xff0c 硬件的失效可能直接导致功能软件输出不可信任的结果 xff0c 从而违背安全目标 由于硬件故障在硬件生命周期中发生时间的随机性 xff0c 在通过改善流程降低系统性失效的同时 xff0
  • 基于功能安全的车载计算平台开发:系统层面

    相对于功能安全概念阶段 xff0c 系统阶段更专注于产品的详细设计 xff0c 涉及系统工程 安全工程和架构设计等不同技术领域 同时 xff0c 系统阶段也经常扮演着供应链上 下游功能安全的DIA交互阶段 xff0c 是功能安全中非常重要且
  • 神器必会!特别好使的编辑器Source Insight

    已剪辑自 https mp weixin qq com s nA9VJeMjC4gDpDSI8r 2FA Source Insight xff08 以下简称SI xff09 是世界上最好的编辑器 xff0c 说这句话不知道会不会出门被打呢
  • QT-GUI应用程序设计基础

    这里有一个容易搞混的点 xff0c 那就是widget h中的命名空间中的类Widget和在该文件中定义的类Widget不是同一个类 这其实也是很好理解的 xff0c 命名空间的作用其实就是将变量和类型的作用范围给控制起来 xff0c 这样
  • QT中怎么设置定时器/周期任务/定时触发任务

    Qt中定时器的使用有两种方法 xff0c 一种是使用QObject类提供的定时器 xff0c 还有一种就是使用QTimer类 其精确度一般依赖于操作系统和硬件 xff0c 但一般支持20ms 下面将分别介绍两种方法来使用定时器 QObjec
  • C语言Socket编程,实现两个程序间的通信

    文章目录 server和client通信流程图实现两个程序间的通信1 服务端server2 客户端client3 怎么运行呢 xff1f 4 重写代码 已剪辑自 https www cnblogs com fisherss p 120851
  • 基于UDP的服务器端和客户端

    文章目录 再谈UDP和TCP基于UDP的服务器端和客户端UDP中的服务器端和客户端没有连接UDP服务器端和客户端均只需1个套接字基于UDP的接收和发送函数基于UDP的回声服务器端 客户端 再谈UDP和TCP 已剪辑自 http c bian
  • Windows下的socket演示程序及加载DLL

    Windows下的socket演示程序 已剪辑自 http c biancheng net view 2129 html 上节演示了 Linux 下的 socket 程序 xff0c 这节来看一下 Windows 下的 socket 程序

随机推荐

  • QT文件操作

    文章目录 QFile文件操作QFile 43 QTextStreamQFile 43 QDataStream 已剪辑自 http c biancheng net view 9430 html 很多应用程序都需要具备操作文件的能力 xff0c
  • C语言文件操作

    文章目录 C语言文件操作C语言中的文件是什么 xff1f 文件流 C语言fopen函数的用法 xff0c C语言打开文件详解fopen 函数的返回值判断文件是否打开成功 fopen 函数的打开方式关闭文件实例演示 文本文件和二进制文件到底有
  • Chapter-3_概率分布

    Chapter 3 概率分布 本文内容摘自 xff1a https seeing theory brown edu probability distributions cn html 概率分布描述了随机变量取值的规律 1 随机变量 随机变量
  • C++文件操作

    文章目录 计算机文件到底是什么 xff08 通俗易懂 xff09 xff1f C 43 43 文件类 xff08 文件流类 xff09 及用法详解C 43 43 open 打开文件 xff08 含打开模式一览表 xff09 使用 open
  • C语言文件操作、C++文件操作、QT文件操作汇总及对比分析

    前面对C语言文件操作 C 43 43 文件操作 QT文件操作进行了比较详细的说明 xff0c 文章链接如下 C语言文件操作 C 43 43 文件操作 QT文件操作 通过大致的了解 xff0c 我们知道C语言文件操作 C 43 43 文件操作
  • 破茧化蝶,从Ring Bus到Mesh网络,CPU片内总线的进化之路

    文章目录 为什么需要片内总线 xff1f 星型连接 环形总线 xff08 Ring Bus xff09 Mesh网络 结论 转载于 xff1a https zhuanlan zhihu com p 32216294 在大多数普通用户眼里 x
  • 片内总线在cpu扮演什么角色?他为什么能实现高效,不同的CPU为什么采用不同的总线协议?

    文章目录 各种新型片上总线维度 xff08 Degree xff09 跳 xff08 Hop xff09 和跳数 xff08 Hop Count xff0c HC xff09 直连拓扑和路由器 Intel的Ring和Mesh 43 总线双R
  • 如何一步一步成为一个技术领域专家

    已剪辑自 https mp weixin qq com s biz 61 Mzg4NjIxODk4Mg 61 61 amp mid 61 2247497216 amp idx 61 1 amp sn 61 12c8b2449baa2c236
  • 电子电气架构设计需要考虑哪些方面?

    当前车辆日益复杂 xff0c 车联网功能在各个细分领域都在不断增加 xff0c 而更强大的智能功能也逐步增加 所有这些高级功能都依赖于线束和控制器才能发挥作用 然而面对日益增加的车辆复杂性和产品开发周期缩短的压力 xff0c 导致汽车制造商
  • 深度解读汽车域控制器

    已剪辑自 https mp weixin qq com s biz 61 Mzg4NjIxODk4Mg 61 61 amp mid 61 2247496089 amp idx 61 1 amp sn 61 db5c08f97342decfa
  • 单片机硬件和软件延时、RTOS相对延时和绝对延时

    已剪辑自 https mp weixin qq com s RPLQn4KO9Aqu1fpfZeOKA 前不久有个读者在问关于延时的问题 xff0c 大概就是问 xff1a 软件延时和硬件延时是啥意思 xff1f 做项目时他俩有什么区别 x
  • 计算机端口的安全知识大全,整的明明白白!

    已剪辑自 https cloud tencent com developer article 1406267 看了网安众安的这篇计算机端口文章 xff0c 你要是学不会你来打我 鲁迅没有说过 端口是计算机的大门 xff0c 计算机的安全应该
  • 自然语言处理概述

    文章目录 本文系书稿选登 2 1 自然语言处理概述2 1 1 什么是自然语言处理2 1 2 自然语言处理的任务 已剪辑自 https mp weixin qq com s hSTkA2ffa1YWCoZOgQdrBQ 本文系书稿选登 2 1
  • Ubuntu安装JLink_Linux_V434a & eclipse for c/c++

    按照网上说法 xff1a 由于ubuntu电脑使用usb口来连接Jlink 因此首先要安装usb的库 使用apt get install libusb命令无法定位到libusb软件 xff0c 于是 下载并安装 http sourcefor
  • 详解C语言二级指针三种内存模型

    已剪辑自 https mp weixin qq com s LRMjzIYIVPs6x6ja5ffp w 二级指针相对于一级指针 xff0c 显得更难 xff0c 难在于指针和数组的混合 xff0c 定义不同类型的二级指针 xff0c 在使
  • 可参考的通信数据接收解析方法

    已剪辑自 https mp weixin qq com s ZwAlQv1wV4M3ivCv4wKakw 前阵子一朋友使用单片机与某外设进行通信时 xff0c 外设返回的是一堆格式如下的数据 xff1a AA AA 04 80 02 00
  • 嵌入式软件测试怎么实现自动化测试?

    我是做嵌入式自动化测试的 xff0c 我来回答下吧 题主你的表达有点混乱 xff0c 我挑出来三个问题 xff1a 1 希望做测试做的高大上 2 不用手工这么累 3 测试做出能看到前景 我也做测试 xff0c 虽然自以为也不很高大上 第一个
  • 嵌入式软件自动化测试方法

  • STM32 | hex文件、bin文件、axf文件的区别?

    已剪辑自 https mp weixin qq com s 1EQRooYYpDeKvHpqguik6w 在STM32开发中 xff0c 经常会碰到hex文件 bin文件与axf文件 xff0c 这些都是可以烧写到板子里运行的文件 这三个文
  • 嵌入式 C 语言进阶小技巧,弱符号和弱引用

    已剪辑自 https mp weixin qq com s 7gBn4CB PwiJBfM0v57 xA 我是老温 xff0c 一名热爱学习的嵌入式工程师 关注我 xff0c 一起变得更加优秀 xff01 工程师老温 xff