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

问题描述 投票:0回答:3

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

enum
的大小?

  • 海湾合作委员会
  • 叮当
  • MSVC
c enums
3个回答
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
投票

C++11 引入了一种标准化方法来执行此操作,但由于这是 C,您必须采用一种更简单的方法来制作最后一个枚举

INT_MAX
或一个足够大的值,以便只有您想要的类型可以容纳它(这就是 DirectX SDK 的作用)。不幸的是,没有办法强制最大大小(至少没有编译器特定的扩展)。


1
投票

通过 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;
© www.soinside.com 2019 - 2024. All rights reserved.