我尝试了一些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指定所有选项(例如短枚举或无短枚举)的数据库?或者是整个源树中散布的所有硬编码魔法?
在 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
类型,它不需要在您的程序中始终具有相同的大小。
优化设置可能很重要,因为enum
在某些机器上4 字节可能比 1 字节枚举快。
归档时间: |
|
查看次数: |
186 次 |
最近记录: |