代码之家  ›  专栏  ›  技术社区  ›  not-a-user

gcc的配置选项如何确定默认枚举大小(short或no short)?

  •  6
  • not-a-user  · 技术社区  · 6 年前

    我尝试了一些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
    

    如您所见,short是嵌入式目标上的默认值,而no short是托管平台上的默认值。这对于提高托管平台上的二进制兼容性是有意义的。现在:

    根据构建gcc时的配置选项,告诉我枚举是否短的规则是什么?它在哪里被记录?

    编辑:

    正如伦丁的回答所指出的, the gcc manual 说明

    在一些目标上, -fshort枚举 是默认值;这由 阿比

    我的问题是: 怎么用? 对abi的依赖性,在哪里有文档记录?gcc源是否包含一种将体系结构(例如arm linux gnueabihf)映射到abis的数据库,以及一种为每个abi指定所有选项(例如短枚举或不短枚举)的数据库?还是所有的硬编码魔法都散布在整个源代码树中?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Lundin    6 年前

    在gcc手册中,查找实现定义的行为。 Chapter 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 无符号整型 它可以代表所有的值。

    在一些目标上, -fshort枚举 是默认值;这由ABI决定。

    这个 斜体字 部分引用了C标准的实现定义行为。如您所见,类型是自适应的,这取决于存在哪些枚举常量。它不必在整个程序中具有相同的大小,因为 enum 类型。

    优化设置可能很重要,因为4个字节 枚举 在某些计算机上可能快于1字节枚举。