当前位置: 首页 > 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.dtcms.com/a/268093.html

相关文章:

  • RPC/gRPC入门学习
  • GM DC Monitor和WGCLOUD,能比吗?
  • 深入理解原子类与CAS无锁编程:原理、实战与优化
  • 【大模型LLM】 Megatron-LM 大模型训练框架吞吐率计算吞吐率优化策略
  • Rust实战:中医丹方智能管理系统
  • ipmitool 使用简介(ipmitool sel list ipmitool sensor list)
  • WebRTC 的 ICE candidate 协商
  • 【卫星语音】基于神经网络的低码率语音编解码(ULBC)方案架构分析:以SoundStream为例
  • 开关电源抄板学习
  • linux chrome浏览器打不开了
  • 线程——基础全解
  • 第一个Flink 程序:词频统计 WordCount(流处理)
  • Peek-Ubuntu上Gif录制工具-24.04LTS可装
  • rxcpp--composite_subscription
  • Kotlin lazy 委托的底层实现原理
  • bottles安装网易云出现的问题02任务卡死没法关闭
  • 【AI大模型】Spring AI 基于mysql实现对话持久存储详解
  • QT6 源(157)模型视图架构里的列表窗体视图 QListWidget :属性,成员函数,槽函数与信号函数,以及源代码带注释。
  • 【运算放大器专题】基础篇
  • 11.进程间通信
  • nginx的使用
  • Qt:QPushButton、QRadioButton、QCheckBox
  • 数据结构:数组:反转数组(Reverse the Array)
  • SQL Server从入门到项目实践(超值版)读书笔记 20
  • 二进制安全-汇编语言-02-寄存器
  • CPT208-Human-Centric Computing: Field Study and Analytics实地研究与分析
  • 【网络安全基础】第六章---Web安全需求
  • 小菜狗的云计算之旅,学习了解rsync+sersync实现数据实时同步(详细操作步骤)
  • QML 使用QtObject定义私有变量
  • 基于springboot的社区生鲜团购系统