我尝试了一些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
正如您所看到的,在嵌入式目标上,短枚举是默认设置,而在托管平台上,无短枚举是默认设置。这样做是为了提高托管平台上的二进制兼容性。现在:
有什么规则告诉我如果使用构建gcc时的配置选项,则枚举将是短的,并且它在哪里记录?
编辑:
正如Lundin的答案所指出的那样,gcc手册说明
在某些目标上,
-fshort-enums
是默认值;这是由ABI确定的。我的问题是:依赖于ABI的方式是怎样的,它在哪里记录?gcc源代码是否包含一种将体系结构(例如arm-linux-gnueabihf)映射到ABI并指定每个ABI的所有选项(例如短枚举或无短枚举)的数据库?还是它全部都是硬编码的魔法散布在整个源树中?