#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 animal_type_e的size是1 byte 如果修改ANIMAL_TYPE_MAX为0xFFFF, 那么enum animal_type_e的size为2 bytes 如果修改ANIMAL_TYPE_MAX为0xFFFFFFFF, 那么enum animal_type_e的size为4 bytes 如果修改ANIMAL_TYPE_MAX为0xFFFFFF, enum animal_type_e的size也为4 bytes, 因为必须按照2的幂的大小进行对齐。