gcc如何通过配置选项确定默认的枚举大小(是否使用short)?

8

我尝试了一些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的所有选项(例如短枚举或无短枚举)的数据库?还是它全部都是硬编码的魔法散布在整个源树中?

对于这种细节,你真的需要阅读源代码。这是GNU软件常见的文档风格。 - pro-gramer
1个回答

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

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

通常,如果枚举中没有负值,则该类型为 unsigned int ,否则为 int 。 如果指定了 -fshort-enums ,则如果有负值,则该类型是可以表示所有值的 signed char short int 中的第一个,否则它是可以表示所有值的 unsigned char unsigned short unsigned int 中的第一个。

在某些目标上, -fshort-enums 是默认设置;这由ABI确定。

这段文字涉及编程相关内容。其中斜体部分引用自C标准的实现定义行为。可以看到,类型取决于枚举常量的数量而进行自适应。在程序中,不同的enum类型大小可以不一致。优化设置可能很重要,因为某些机器上4字节的enum可能比1字节的enum更快。

谢谢提供链接。我的问题是:API的依赖关系是如何的,这在哪里有记录? - not-a-user
ABI是低级系统设置,gcc并不一定与之相关。显然,它是特定于系统的。这里有一个针对x86的例子:https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI - Lundin
谢谢提供的链接。 GCC源码中是否包含一种数据库,用于将体系结构(例如 arm-linux-gnueabihf)映射到ABI,并指定每个ABI的所有选项(例如短枚举或无短枚举)的一种数据库?还是整个源代码树中散布着硬编码魔法? - not-a-user
@not-a-user 我不知道,关于gcc编译器的内部问题,我不是合适的人选。 - Lundin
关于“ABI依赖性如何”的问题。我并不是在挖苦,但这是ABI的一部分,因为这是由ABI定义的信息类型。对于每个处理器,“c”调用约定的实现方式都是ABI的一部分,无论参数是否放在堆栈上或者它们是否可以存储在寄存器中。同样,枚举类型的表示方式也是每个处理器ABI的一部分。 - drlolly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接