目录

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的幂的大小进行对齐。