是否有任何扩展功能可以在每个编译器上指定C enum
的大小?
答案 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
,请确保包含 enum
和 typedef
定义的大小说明符:
enum Tristate : char { Yes, No, Maybe };
typedef enum Tristate : char Tristate;
否则你会收到编译器警告。
或者你直接定义一个匿名的 enum
和 typedef
:
typdef enum : char { Yes, No, Maybe } Tristate;