是否有任何扩展功能可以在每个编译器上指定 C
enum
的大小?
使用 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 标准(并且您会看到一些非常有趣的错误)。
C++11 引入了一种标准化方法来执行此操作,但由于这是 C,您必须采用一种更简单的方法来制作最后一个枚举
INT_MAX
或一个足够大的值,以便只有您想要的类型可以容纳它(这就是 DirectX SDK 的作用)。不幸的是,没有办法强制最大大小(至少没有编译器特定的扩展)。
通过 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;