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

编程语言艺术: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.xdnf.cn/news/15030.html

相关文章:

  • bro code笔记 inheritance
  • 从前端转nest.js开发的学习路线
  • 【Guava】1.0.设计虚拟机的方向
  • java学习——guava并发编程练习
  • Redis ①⑤-集群
  • Vue+Openlayers加载OSM、加载天地图
  • 周任务自动化升级:N8N与多维表格无缝联动全解析
  • 2025年03月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 【架构艺术】IC(个人贡献者)视角下产品研发规划的实战Tips
  • 一次内存“卡顿”全流程实战分析:从制造问题到优化解决
  • java中,stream的filter和list的removeIf筛选速度比较
  • JMM--数据原子操作
  • SpringAI与智能体入门
  • 解决kali Linux在VMware中的全局缩放问题
  • 量化可复用的UI评审标准(试验稿)
  • Python PyJWT详解:从入门到实战
  • 3dmax烘焙插件3dmax法线贴图烘焙教程glb和gltf元宇宙灯光效果图烘焙烘焙光影贴图支持VR渲染器
  • 针对工业触摸屏维修的系统指南和资源获取途径
  • NumPy-核心函数np.matmul()深入解析
  • CppCon 2018 学习:Surprises In Object Lifetime
  • 设计模式之访问者模式
  • 使用Langchain访问个人数据
  • SpringBoot系列—入门
  • PostgreSQL表操作
  • 深度学习5(深层神经网络 + 参数和超参数)
  • C++ 网络编程(15) 利用asio协程搭建异步服务器
  • 从数据洞察到设计创新:UI前端如何利用数字孪生提升用户体验?
  • 浏览器与服务器的交互
  • dify 1.5.1版本全面解析——知识库索引、动态参数及结构化输出插件全新登场
  • STM32的 syscalls.c 和 sysmem.c