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语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136713
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62576
  • 编译器
    +关注

    关注

    1

    文章

    1624

    浏览量

    49111

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

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

收藏 人收藏

    评论

    相关推荐

    snmp口令及安全加固

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

    4G5G手机信号放大器:从,为数字生活加速

    深圳特信屏蔽器|4G5G手机信号放大器:从,为数字生活加速
    的头像 发表于 09-11 16:18 546次阅读

    电机磁时的电流大小关系?

    电机的相电流按矢量选择分为励磁电流和转矩电流,励磁电流用于产生磁场,转矩电流用于提供扭矩。 在电机磁时,即到达恒功率区时刻,电机的励磁电流开始减小,这是因为要磁,但是转矩电流会增大,这是因为要
    发表于 07-13 13:09

    其利天下技术·无刷电机磁控制是什么?有什么好处·BLDC驱动方案

    作为一个无刷电机驱动方案开发商,我们在开发产品的时候就会用到“磁控制技术”。比如,我们开发的吸尘器方案时就会用到。什么是磁控制技术,它又有什么优势呢?其利天下技术无刷电机驱动方案开发
    的头像 发表于 06-07 18:42 1032次阅读
    其利天下技术·无刷电机<b class='flag-5'>弱</b>磁控制是什么?有什么好处·BLDC驱动方案

    什么是电机的磁?电机磁的可能原因有哪些?

    在电机运行的过程中,我们有时会遇到电机磁的情况。电机磁,简而言之,即电机在运行时输出功率下降,不足以满足正常使用需求的现象。这一现象可能由多种原因引起,对电机的性能和运行稳定性产生不良影响。本文将详细探讨电机的磁现象及其可
    的头像 发表于 06-04 16:15 4226次阅读

    4G手机信号放大器:解决信号区,提升移动网络

    深圳特信电子|4G手机信号放大器:解决信号区,提升移动网络
    的头像 发表于 05-06 08:58 1604次阅读

    关于嵌入式C语言符号引用解析

     总之,__attribute__ 起到了给编译器提供上下文的作用,如果错误的使用 __attribute__ 指令,因为给编译器提供了错误的上下文,由此引起的错误通常很难被发现。
    发表于 05-03 10:48 227次阅读

    STM32 GPIO上拉能做输入输出吗?

    STM32 GPIO 上拉能做输入输出吗
    发表于 04-07 07:07

    使用WorkBench做BLDC的磁控制,但是电机转速没看到提升的迹象,为什么?

    目前使用WorkBench做BLDC的磁控制,已经使能了MTPA和Flux weakening选项,查看单片机运行的反馈也有勾选“Flux weakening”,但是电机转速没看到提升的迹象。空转额定是5500rpm左右,开磁还是这么多。
    发表于 04-03 08:10

    FOC电机控制HALL+磁,开启磁之后为什么转速会一直增加,不受PI控制?

    FOC电机控制代码使用HALL没开启磁之前可以通过PI调节转速,但是开启磁之后为什么转速会一直增加,不受PI控制?
    发表于 03-27 07:55

    电机控制磁开启之后,为什么转速提高电流也提升了?

    根据磁控制原理,不应该是达到当前电压转速极限之后开启磁电流降低,转速增加吗?
    发表于 03-27 06:50

    宋仕论道”系列讲座的文章暨宋仕先生研究华强北模式和华强北文化的系列文章,再次迎来更新!

    :科技创新驱动电子信息生态重构》的评论类文章,明确指出“近日,中国电子元器件产业权威人士宋仕对深圳华强北的转型之路进行了深入剖析”,并在文章中多处引用了宋仕先生关于深圳华强北的研究观点。不到一天
    发表于 03-26 10:36

    AI时代,存

    以存算,以存训,以存
    的头像 发表于 03-22 09:17 2158次阅读
    AI时代,存<b class='flag-5'>强</b>则<b class='flag-5'>强</b>

    双面布局贴补,FPC焊接很受伤

    颗是什么味道。 一大早,林如烟和赵理工刚来到办公室、大师兄让他们稍微整理下,就开始讲FPC补的介绍、分类、作用,特别是关于补的案例,真的让他们感慨事后诸葛亮,事前很迷茫。 什么是补
    发表于 03-11 17:57

    枚举有多大?c语言枚举end的作用是什么?

    枚举有多大?c语言枚举end的作用是什么? 枚举在C语言中是一种常见的数据类型,用于定义一组相互关联的常量或者变量。它通常用于表示一系列可能
    的头像 发表于 01-19 14:19 593次阅读