GNUC compiler attribute
GNU C的__attribute__
机制可以设置函数属性, 变量属性和类型属性.
语法格式:
__attribute__((attribute list))
attribute前后都有两个下划线,并紧跟一对圆扩号。 放置于声明的尾部, “;” 之前。
packed attribute
__attribute__((packed))
让编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
不加packed属性修饰
enum animal_type_e { ANIMAL_TYPE_CAT = 0, ANIMAL_TYPE_DOG, ANIMAL_TYPE_TIGGER, ANIMAL_TYPE_WOLF, ANIMAL_TYPE_MAX = 0xFF, }; int main(int argc, char *argv[]) { printf("sizeof(enum animal_type_e) = %zu\n", sizeof(enum animal_type_e)); return 0; } 执行结果 $ ./packed sizeof(enum animal_type_e) = 4 enum animal_type_e类型的大小为4,和int类型的大小相同
使用packed属性限制枚举类型的size
enum animal_type_e { ANIMAL_TYPE_CAT = 0, ANIMAL_TYPE_DOG, ANIMAL_TYPE_TIGGER, ANIMAL_TYPE_WOLF, ANIMAL_TYPE_MAX = 0xFF, } __attribute__((packed));
enum animaltypee的size是1 byte
如果修改ANIMALTYPEMAX为0xFFFF, 那么enum animaltypee的size为2 bytes
如果修改ANIMALTYPEMAX为0xFFFFFFFF, 那么enum animaltypee的size为4 bytes
如果修改ANIMALTYPEMAX为0xFFFFFF, enum animaltypee的size也为4 bytes, 因为必须按照2的幂的大小进行对齐。