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

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

3天内不再提示

深入探索GCC的attribute属性

学益得智能硬件 来源:学益得智能硬件 2025-02-13 10:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

如果经常看Linux源码,一定会见过 attribute 属性,他在 Linux 里面出现的很多。

attribute 是 gcc 的扩展功能,它不属于标准C语言

使用 attribute 可以修饰变量、函数或者数据类型的属性,属性有很多,有些确实很有用。

找了几个可以修饰函数的属性,供大家参考下。

如果希望函数可以在 main 函数前面执行,可以用 constructor 属性,就是构造的意思。

如果希望函数可以在 main 函数之后执行,可以用 destrucotr 属性,有点析构的意思。

网上有些介绍使用这两个属性来模拟 C++ 的构造函数和析构函数,说实话,这比 C++ 里面的构造和析构差远了,用它来给程序做些初始化、回收的操作,还是可以的。

第二个,nonnull。

写函数的时候,我们经常对函数做入参判断,比如防止传进来的参数是空指针,导致程序下面出现异常。

使用 nonnull 属性,可以让编译器来判断。如果传进来的参数是 NULL,编译的时候会提示警告,非常的人性化。

第三个,deprecated。

如果想把某个函数废弃掉,比如在项目的后续版本中不再使用,可以使用 deprecated 属性,加上这个属性,如果你还是使用这个函数,编译就会提示警告。

比如常见的 gets 函数,如果一下子把它从标准库中删掉,对以前的程序不够友好,所以只能提醒。

第四个,noreturn。

对于不会返回的函数,可以使用 noreturn 属性。注意,返回值是 void 类型和函数不返回是两码事,这样的代码编译会提示警告。

如果在函数内部加上死循环或者退出,这样的函数才属于不返回。

第五个,weak,用于定义弱函数。

比如在一个文件中定义了弱函数,另一个文件完全可以重新再定义一遍,并且编译器会自动链接到用户定义的新函数上。

weak 属性在 STM32 上面出现的很多,比如中断函数等等。

gcc 扩展的属性很多,打开 gcc 文档,粗略的估算了一下,可能有百来个。

可能是C语言也发现了这些属性好用,在最新的C23标准里面,也加入了属性这个概念,不过用法很奇葩,使用两个嵌套的中括号,而且目前支持的属性也比较少。

编译器一直都是走在标准的前面,也许在接下来的某个C语言标准中,会有更多的 gcc 属性加入到C语言中。

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

    关注

    88

    文章

    11849

    浏览量

    219760
  • GCC
    GCC
    +关注

    关注

    0

    文章

    112

    浏览量

    26435

原文标题:gcc的attribute属性,确实值得学习

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    关于C语言对齐的一些总结

    ) ,就按 4 字节对齐); 强制对齐 :用 __attribute__((aligned(n))) (GCC/Clang)或 #pragma pack(n) (MSVC/GCC)指定对齐值 n (必须
    的头像 发表于 05-08 11:23 425次阅读

    CW32系列MCU在Eclipse GCC + JLink下的使用示例分享

    CW32系列MCU在Eclipse GCC + JLink下的使用示例: 1、下载安装Eclipse IDE for Embedded C/C++ Developers。 2、下载安装
    发表于 02-02 06:57

    GCC开发工程的模版

    1、拷贝一份工程,另存为cw32l083_gcc,并用vscode打开。 2、到官网下载cw32l083的固件库。 3、把cw32l083-stdperiph-lib/Libraries下面的固件
    发表于 11-28 08:15

    芯来IDE是否支持__attribute__( (packed) )?需要设置什么吗?

    要开发一个以太网应用,使用__attribute__( (packed) ),可是在初始化的时候检查size发现没有按照要求压缩。想问一下需要设置什么吗,还是说不支持。
    发表于 11-10 08:12

    如何将某个函数或变量放在固定的地址 ?

    如题,如何将某个函数或者变量放在固定的地址?类似于__attribute__( at(绝对地址) ),用的nucleistudio ide, __attribute__( at(绝对地址) )出现警告 at属性被忽视,有类似的
    发表于 11-07 06:07

    如何利用 gcc 编译Ccode?

    最近在玩e203_hbirdv2,利用默认的case 可以仿真。现在想自己写C code 进行仿真,请问该如何利用 gcc 编译?有没有 详细的教程。
    发表于 11-05 12:37

    GD32F470使用__attribute__语句,keil编译通过但是scons编译不通过,为什么?

    问题语句: uint16_t ltdc_lcd_framebuf0[800][480] __attribute__((at(LCD_FRAME_BUF_ADDR))); 上述语句在keil编译
    发表于 10-14 06:05

    商品类目属性查询接口技术实现详解

    attribute_type string 否 属性类型过滤(K/S/N) page int 否 当前页码(默认1) page_size int 否 每页数量(默认20) lang string 否 语言标识(如zh-CN/en-US) 三、技
    的头像 发表于 10-11 15:43 627次阅读
    商品类目<b class='flag-5'>属性</b>查询接口技术实现详解

    cubemx+clion+gcc无法使用msh怎么解决?

    通过STM32CUMX配置RTTHREAD NANO ,用keil编译并且移植shell之后,输入键盘上下键无反应,而用clion+gcc编译后(修改过启动文件),只能打印version信息,无法显示msh和输入,两者除了启动文件以外,其余的配置基本相同,请问为啥gcc
    发表于 09-23 07:36

    《AI芯片:科技探索与AGI愿景》—— 深入硬件核心的AGI指南

    《AI芯片:科技探索与AGI愿景》一书如同一张详尽的“藏宝图”,为读者指明了通往下一代人工智能的硬件之路。作者没有停留在空洞的概念层面,而是直击核心,从冯·诺依曼架构的“内存墙”瓶颈切入,清晰阐述了
    发表于 09-17 09:29

    为什么将 GCC 项目导入 NuEclipse 失败?

    为什么将 GCC 项目导入 NuEclipse 失败?
    发表于 09-01 08:05

    如何将GCC项目导入NuEclipse?

    如何将GCC项目导入NuEclipse?
    发表于 09-01 07:04

    CW32L010 MCU在VSCode+GCC+EIDE+JLink下的使用示例

    CW32L010 MCU 在VSCode+GCC+ EIDE + JLink 下的使用示例: 1、点击VSCode左边栏中的Extensions,在EXTENSIONS:MARKETPLACE搜索
    的头像 发表于 07-01 14:52 1310次阅读
    CW32L010 MCU在VSCode+<b class='flag-5'>GCC</b>+EIDE+JLink下的使用示例

    \"module object has no attribute load\"这个怎么解决?

    \"module object has no attribute load\"这个怎么解决
    发表于 06-19 07:03

    cubemx+clion+gcc无法使用msh怎么解决?

    通过STM32CUMX配置RTTHREAD NANO ,用keil编译并且移植shell之后,输入键盘上下键无反应,而用clion+gcc编译后(修改过启动文件),只能打印version信息,无法显示msh和输入,两者除了启动文件以外,其余的配置基本相同,请问为啥gcc
    发表于 06-13 08:17