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