0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言强/弱符号和强/弱引用的作用

小麦大叔 来源:小麦大叔 作者:小麦大叔 2022-07-12 11:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

__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'
  • 当两者为一强一弱时,选取强符号的值
  • 当两者同时为弱时,选择其中占用空间较大的符号,这个其实很好理解,编译器不知道编程者的用意,选择占用空间大的符号至少不会造成诸如溢出、越界等严重后果。

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

intx;
intx=1;

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

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

int__attribute__((weak))x=0;
intx=1;

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

强引用和弱引用

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

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

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

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

__attribute__((weakref))voidfunc(void);

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

__attribute__((weakref))voidfunc(void);
voidmain(void)
{
if(func){func();}
}

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

warning:‘weakref’attributeshouldbeaccompaniedwithan‘alias’attribute[-Wattributes]

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

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

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

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

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

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

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

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144554
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66812
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51069

原文标题:C语言进阶小技巧,弱符号和弱引用

文章出处:【微信号:knifewheat,微信公众号:小麦大叔】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    联创电子荣登2025江西企业100榜单

    11月21日,江西省企业联合会、省企业家协会发布“2025江西企业100”榜单,并首次推出“2025江西制造业企业100”“2025江西服务业企业60”“2025江西战略性新兴产业企业60
    的头像 发表于 12-01 15:53 258次阅读

    传音控股荣登2025广东企业500榜单

    10月29日,广东省企业联合会、广东省企业家协会(简称“省企联”)在广州召开新闻发布会,正式发布了“2025广东企业500”等榜单及相关分析报告。传音控股入选“2025广东企业500”榜单,位列
    的头像 发表于 10-31 09:40 201次阅读

    信号样品在比表面与孔径分析中的数据处理与增强技巧

    在比表面与孔径分析中,信号样品(如低比表面积材料、微量样品或低孔隙率材料)因吸附信号微弱,易被背景干扰掩盖,导致数据精度下降甚至无法准确分析。这类样品的分析核心在于“精准捕捉有效信号” 与 “科学
    的头像 发表于 10-29 09:32 123次阅读
    <b class='flag-5'>弱</b>信号样品在比表面与孔径分析中的数据处理与增强技巧

    福晶科技PLI吸收测试仪成功交付北京某研究所

    近日,福晶科技研制的PLI吸收测试仪成功交付北京某研究所。这是继该设备获国家级科研单位引进后,又一次成功交付国内权威科研机构。
    的头像 发表于 09-04 16:00 496次阅读

    FX3是否支持配置一个GPIO引脚作为一个下拉的输入?

    FX3是否支持配置一个GPIO引脚作为一个下拉的输入?如果可以的话,这将如何完成?#CYUSB3014
    发表于 08-11 07:47

    德思特案例 | 一套设备兼容四大测试场景:全面解析网测试方案

    随着用户对网络体验要求的不断提升,网环境下的稳定性已不再是“加分项”,而是终端产品必须具备的“基本功”。德思特通过现网模拟 + 参数可控 + 自动化测试 + 创新硬件设计,为行业提供了一套完整、可复用、可扩展的网测试解决方案。
    的头像 发表于 08-08 10:47 769次阅读
    德思特案例 | 一套设备兼容四大测试场景:全面解析<b class='flag-5'>弱</b>网测试方案

    无位置传感器直流无刷电机磁调速控制的优化

    在无位置传感器直流无刷电机的磁控制过程中,随着礁程度加深,电流波动会越来越严重,导致电机电礁转矩波动的厉害。实验表明,不同的 PWIM 控制方式会使得电流波动的大小不同。从理论上分析为什么PWM
    发表于 08-04 14:51

    无刷电机磁控制:技术原理与实战应用

    在电机控制领域,磁控制技术一直是备受关注的焦点之一。尤其是对于无刷电机来说,磁控制不仅能够提升其性能,还能拓展其应用范围。今天,就让我们深入探讨一下无刷电机磁控制的奥秘以及它所带来的诸多
    的头像 发表于 08-01 18:05 9034次阅读
    无刷电机<b class='flag-5'>弱</b>磁控制:技术原理与实战应用

    上汽集团入选2025年财富世界500

    《财富》杂志于北京时间7月29日公布了2025年世界500排行榜。上汽集团以2024年度合并报表872.239亿美元的营业收入名列世界500第138位,第二十一次进入世界500排行榜。
    的头像 发表于 07-31 15:44 840次阅读

    C语言精彩编程百例-364页

    内容提要 C是一种通用的程序设计语言,它包含了紧凑的表达式、丰富的运算符集合、现代控制流以及数据结构等四个部分。C语言功能丰富,衣达能力
    发表于 06-13 17:28

    福晶科技PLI吸收测试仪成功交付客户

    佳音再至,福晶科技自主研发的PLI吸收测试仪成功交付中国科学院某研究所。该设备集成了1064 nm、532 nm、355 nm和266 nm四个波长的泵浦光源,可精准检测晶体吸收特性,为新型晶体尤其是紫外晶体的开发和性能研究提供关键技术支撑。
    的头像 发表于 06-10 17:47 995次阅读

    芯盾时代用户身份和访问管理平台助力企业消灭口令

    口令,是网络安全中的老大难问题,因为口令导致的重大网络安全事件屡见不鲜。在攻防演练中,利用口令进行攻击是红队最常用的攻击手段之一,在所有攻击中占比近30%,仅次于0day漏洞。
    的头像 发表于 04-27 09:16 704次阅读

    景嘉微荣获2024湖南湘江新区民营企业“税收贡献百”“研发投入百”“社会责任百”称号

    近日,在湖南湘江新区民营企业家座谈会上,2024 湖南湘江新区民营企业百榜单正式揭晓。长沙景嘉微电子股份有限公司凭借卓越的表现,成功斩获 “税收贡献百”“研发投入百”“社会责任百
    的头像 发表于 02-23 17:50 1143次阅读

    继电器的作用及常用类型介绍

    控制。 隔离 :继电器可以在不同电压或电流等级的电路之间提供电气隔离,保护控制电路不受高电压或大电流的影响。 放大 :在信号控制负载的情况下,继电器可以将小信号放大,驱动较大的负载。 转换 :继电器可以实现电路状态的转换
    的头像 发表于 12-28 11:09 5077次阅读

    snmp口令及安全加固

    snmp口令及安全加固 口令检测   nmap –sU –p161 –script=snmp-brute ip //查找snmp口令   口令利用   nmap -sU -p1
    的头像 发表于 12-17 14:47 2043次阅读