当前位置: 首页 > news >正文

编程语言艺术:C语言中的属性attribute笔记总结

attribute字段

    • 一、概念
    • 二、常用属性举例
      • 2.1 stm32f1的标准固件库
      • 2.2 linux内核代码
    • 三、适用场景

一、概念

GNU C的一大特色就是__attribute__机制;

__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute):

函数属性(Function Attribute),函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强大;
函数属性可以使用的参数官网:
https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Function-Attributes.html#Function-Attributes

类型属性目前有七个可以对结构体、共用体、枚举类型进行定义声明,详见官网: https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Type-Attributes.html#Type-Attributes

变量属性可以对变量进行属性配置,见官网:
https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Variable-Attributes.html#Variable-Attributes

__attribute__前后都有两个下划线,并且后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数;

attribute语法格式为:attribute ( ( attribute-list ) ) ;

二、常用属性举例

2.1 stm32f1的标准固件库

在core_cm3.c中对unit32_t __get_PSP(void )和 unit32_t __get_MSP(unit32_t topOfMainStack )函数使用了函数修饰属性 attribute( (naked) ) 表示使用裸模式手动管理寄存器的恢复和保存;

在工程示例代码中使用attribute( (at(绝对地址) ))对变量进行绝对地址定位,不由编译器自动分配变量在内存或存储中的位置;

在工程示例代码中使用attribute(( section(段名)))将变量指定到编译后执行程序的指定段中;

2.2 linux内核代码

内核代码中在对结构体修饰时大量使用了attribute((packed))防止编译器对结构体进行自动对齐使结构体的大小接近结构体中变量大小的总和,是对占用内存、存储的一种优化;

内核代码中在对结构体修饰时大量使用了attribute((aligned(对齐大小)))对结构体进行自动对齐对代码的执行访问性能进行的优化;

内核代码中也大量使用了attribute((section(段名)))等属性对编译器行为进行了约束;

三、适用场景

attribute是在程序编译时起作用的,要对编译原理的过程有深入的理解,结合函数、类型、变量可以用的属性以及每个属性的作用,在实际开发过程中予以应用会可以避免一些奇怪问题的出现;

http://www.lryc.cn/news/581652.html

相关文章:

  • 程序员在线接单
  • 浅谈漏洞扫描与工具
  • 大型语言模型中的自动化思维链提示
  • 【数据分析】R语言多源数据的基线特征汇总
  • 玄机——第三章 权限维持-linux权限维持-隐藏练习
  • Dify+Ollama+QwQ:3步本地部署,开启AI搜索新篇章
  • 实现Spring MVC登录验证与拦截器保护:从原理到实战
  • 【机器学习深度学习】 如何解决“宏平均偏低 / 小类识别差”的问题?
  • HRDNet: High-resolution Detection Network for Small Objects论文阅读
  • mac中创建 .command 文件,执行node服务
  • Omi录屏专家 Screen Recorder by Omi 屏幕录制Mac
  • 【Linux】基础开发工具(1)
  • 开发项目时遇到的横向越权、行锁表锁与事务的关联与区别、超卖问题
  • Java学习——Lombok
  • Anaconda 常用命令
  • 【Elasticsearch】自定义评分检索
  • 【卫星语音】基于神经网络的低码率语音编解码(ULBC)方案架构分析:以SoundStream为例
  • Maven引入第三方JAR包实战指南
  • Day06- (使用asyncio进行异步编程:事件循环和协程)
  • 群晖 DS3617xs DSM 6.1.7 解决 PhotoStation 安装失败问题 PHP7.0
  • 数据结构---B+树
  • Modbus 与 BACnet 协议互操作:工业协议转换方案(二)
  • 深入理解 classnames:React 动态类名管理的最佳实践
  • 【系统分析师】2023年真题:论文及解题思路
  • 【机器学习笔记Ⅰ】7 向量化
  • 【IOS】XCode创建firstapp并运行(成为IOS开发者)
  • Tuning Language Models by Proxy
  • CentOS-6与CentOS-7的网络配置IP设置方式对比 笔记250706
  • 【Vibe Coding 实战】我如何用 AI 把一张草图变成了能跑的应用
  • 黑马点评系列问题之基础篇16jedis redis依赖引入后仍然还是报错