【问题标题】:What's the data-type of C enum of Clang compiler?Clang 编译器的 C 枚举的数据类型是什么?
【发布时间】:2011-03-31 09:18:43
【问题描述】:

我发布了另一个问题:What type should I use for binary representation of C enum?,通过答案,我必须知道我的编译器的枚举数据类型。

Clang 编译器上 C 枚举的数据类型是什么?

【问题讨论】:

    标签: c enums clang types


    【解决方案1】:

    除了 Carl 的回答之外,它甚至可能与有符号或无符号类型兼容,如果其中任何一个更适合的话。例如它可以但不能在

    enum small { m = -1; a = 127; };
    enum big { b = 255; };
    

    signed char 中有small,在unsigned char 中有big

    顺便说一句,常量mab 不是枚举类型,但始终是int 类型。

    编辑:我刚刚测试了大于int 的值。在 C99 模式下,gcc 发出错误(这是正确的),但 clang 仅发出警告,并且具有更广泛的类型来表示 enum

    【讨论】:

      【解决方案2】:

      像大多数(可能是所有)C 编译器一样,枚举类型的大小可能会有所不同。这是一个示例程序及其输出:

      #include <stdio.h>
      
      typedef enum
      {
        val1 = 0x12
      } type1;
      
      typedef enum
      {
        val2 = 0x123456789
      } type2;
      
      int main(int argc, char **argv)
      {
        printf("1: %zu\n2: %zu\n", sizeof(type1), sizeof(type2));
        return 0;
      }
      

      输出:

      1: 4
      2: 8
      

      标准要求的只是:

      类型的选择是实现定义的,但应该能够表示枚举所有成员的值。

      快速的网络搜索并没有找到详细说明其行为的 clang 手册,但几乎可以肯定在某处。

      【讨论】:

      • clang-11 将我的 64 位枚举值放入 32 位类型。他们被截断。因此,显然并非所有主流编译器都遵循规范。 :-/
      【解决方案3】:

      好吧,编译器可能会选择一个足够大的整数大小,但我猜它会选择一个“本机”大小(一个“字”= 寄存器大小,对于 x86 32 位模式应该是长的,对于 x64 应该是长长的)。对于您的私有结构,您不应该关心,但是如果您想将其序列化到文件或通过网络,那么您应该明确使用足够大(例如长)的整数类型,以便您可以使用另一种编译器/语言来获取它没有头痛。

      如果你真的想知道,就问编译器吧:

      printf("%d\n", sizeof(enum myEnumType));
      

      【讨论】:

        猜你喜欢
        • 2015-09-26
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多