文章目录
  1. 1. packed attribute
    1. 1.1. 不加packed属性修饰
    2. 1.2. 使用packed属性限制枚举类型的size

GNU C的__attribute__机制可以设置函数属性, 变量属性和类型属性.
语法格式:
__attribute__((attribute list))
attribute前后都有两个下划线,并紧跟一对圆扩号。 放置于声明的尾部, “;” 之前。

packed attribute

__attribute__((packed))
让编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

不加packed属性修饰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

1
2
3
4
5
6
7
8
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的幂的大小进行对齐。

文章目录
  1. 1. packed attribute
    1. 1.1. 不加packed属性修饰
    2. 1.2. 使用packed属性限制枚举类型的size