如何通过gcc的配置选项确定默认枚举大小(短或非短)?

not*_*ser 6 c enums gcc abi

我尝试了一些gcc编译器来查看默认的枚举大小是短(至少一个字节,如强制-fshort-enums)还是不短(至少4个字节,强制使用-fno-short-enums):

user@host:~$ echo '_Static_assert(4 == sizeof(enum{E}), "enum size is not 4");' | x86_64-linux-gnu-gcc -fsyntax-only -xc - && echo "OK, enum size is 4 on x86_64-linux-gnu"
OK, enum size is 4 on x86_64-linux-gnu

user@host:~$ echo '_Static_assert(4 == sizeof(enum{E}), "enum size is not 4");' | arm-linux-gnueabihf-gcc -fsyntax-only -xc - && echo "OK, enum size is 4 on arm-linux-gnueabihf"
OK, enum size is 4 on arm-linux-gnueabihf

user@host:~$ echo '_Static_assert(4 == sizeof(enum{E}), "enum size is not 4");' | /opt/Atollic_TrueSTUDIO_for_STM32_x86_64_9.1.0/ARMTools/bin/arm-atollic-eabi-gcc -fsyntax-only -xc -
<stdin>:1:1: error: static assertion failed: "enum size is not 4"

user@host:~$ echo '_Static_assert(4 == sizeof(enum{E}), "enum size is not 4");' | /opt/Atollic_TrueSTUDIO_for_STM32_x86_64_9.1.0/ARMTools/bin/arm-atollic-eabi-gcc -fno-short-enums -fsyntax-only -xc - && echo "OK, enum size is 4 on arm-atollic-eabi with -fno-short-enums"
OK, enum size is 4 on arm-atollic-eabi with -fno-short-enums
Run Code Online (Sandbox Code Playgroud)

如您所见,short是嵌入式目标的默认值,而no-short是托管平台上的默认值.这有助于改善托管平台上的二进制兼容性.现在:

根据构建gcc时的配置选项以及记录的位置,告诉我枚举是否很短的规则是什么?

编辑:

正如Lundin的回答所指出的那样,gcc手册指出了这一点

在某些目标上,-fshort-enums是默认值; 这是由ABI决定的.

我的问题是:如何依赖ABI,以及它在哪里记录?gcc源是否包含一种将架构(例如arm-linux-gnueabihf)映射到ABI的数据库和一种为每个ABI指定所有选项(例如短枚举或无短枚举)的数据库?或者是整个源树中散布的所有硬编码魔法?

Lun*_*din 6

在 gcc 手册中,查找实现定义的行为。第 4.9 章

与每个枚举类型(C90 6.5.2.2、C99 和 C11 6.7.2.2)兼容的整数类型

通常,unsigned int如果枚举中没有负值,则类型为,否则为int。如果-fshort-enums被指定,然后,如果有负值它是第一的signed charshort并且int可以表示所有的值,否则它是第一的unsigned charunsigned short并且unsigned int可以表示所有的值。

在某些目标上,-fshort-enums是默认值;这是由 ABI 决定的。

斜体部分是从C标准的实现定义引用。如您所见,类型是自适应的,具体取决于存在的枚举常量。对于不同的enum类型,它不需要在您的程序中始终具有相同的大小。

优化设置可能很重要,因为enum在某些机器上4 字节可能比 1 字节枚举快。