用于指定C enum大小的GCC / Clang / MSVC扩展?

时间:2011-05-28 04:38:44

标签: c compiler-construction enums size

是否有任何扩展功能可以在每个编译器上指定C enum的大小?

  • GCC
  • MSVC

3 个答案:

答案 0 :(得分:2)

使用GCC,您无法指定确切的长度,但可以使用-fshort-enums占用最短的长度。例如:

#include <stdio.h>

typedef enum
{
    f1, f2
} foo;

int main()
{
    printf("%i\n", sizeof(foo));
    return 0;
}

编译:

gcc program.c -fshort-enums

输出:

1

但是,如果你想要链接到任何东西,你必须确保看到你的标题的人也使用-fshort-enums或者它不符合ABI(你会看到一些非常有趣的错误)。

答案 1 :(得分:0)

C ++ 11引入了一种标准化的方法来实现这一点,但由于这是C,你必须采用一种更简单的方法来制作最后一个枚举INT_MAX或一个足够大的值,以便只您想要的类型可以容纳它(这是DirectX SDK所做的)。不幸的是,没有办法强制最大化(至少没有编译器特定的扩展)。

答案 2 :(得分:0)

使用 clang 你可以使用这个:

enum Tristate : char { Yes, No, Maybe };

如果您想要 typedef,请确保包含 enumtypedef 定义的大小说明符:

enum Tristate : char { Yes, No, Maybe };
typedef enum Tristate : char Tristate;

否则你会收到编译器警告。

或者你直接定义一个匿名的 enumtypedef

typdef enum : char { Yes, No, Maybe } Tristate;