枚举值
描述
指定编译器用于表示枚举的字节数。 pragma 会影响所有后续枚举定义,直到编译单元结束或迂到另一个 #pragma enum 伪指令为止。 如果使用了多个 pragma ,那么最近迂到的 pragma 是生效的。 此编译指示将覆盖第 ENUM页上描述的 ENUM 编译器选项。
参数
- 1, 2, 4, 8
- 指定枚举存储在 1 , 2 , 4 或 8 字节的容器中。 容器的符号由枚举中的值范围确定,但当范围允许时,优先考虑签名。 pragma enum(8) 伪指令仅在 C++ 中可用。
- int
- 使枚举存储在枚举的 ANSI C 或 C++ 标准表示法中,即 4-bytes。 在 C++ 程序中,如果枚举中的值超过 231-1 (根据 ANSI C++ 标准) ,那么 int 容器可能会变为 4-bytes unsigned。
- 因特隆
- 指定如果枚举中的值范围超过 int 的限制,那么枚举将占用 8 字节的存储空间。 如果枚举中的值范围未超过 int 的限制,那么枚举将占用 4 字节的存储空间,并且表示为如同指定了 enum (int)。 编译指示 enum(intlong) 伪指令仅在 C++ 中可用
- 小型
- 在给定枚举中的值的情况下,会将后续枚举放入尽可能小的容器中。 容器的符号由枚举中的值范围确定,但当范围允许时,将优先考虑无符号。
- 出栈
- 选择先前生效的枚举大小,并废弃当前设置。
- 系统缺省值
- 选择缺省枚举大小,即
small选项。 - user_default
- 选择由
ENUM编译器选项指定的枚举大小。
枚举设置可接受的值范围如下所示:
| Range of Element Values | Enum Options | ||||||
|---|---|---|---|---|---|---|---|
small(缺省值) |
1 |
2 |
4 |
8(仅限 C + +) |
int |
intlong (仅限 C + +) |
|
0 .. 127 |
1 byte unsigned |
1 byte signed |
2 bytes signed |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 .. 255 |
1 byte unsigned |
1 byte unsigned |
2 bytes signed |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
-128 .. 127 |
1 byte signed |
1 byte signed |
2 bytes signed |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 .. 32767 |
2 bytes unsigned |
ERROR |
2 bytes signed |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 .. 65535 |
2 bytes unsigned |
ERROR |
2 bytes unsigned |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
-32768 .. 32767 |
2 bytes signed |
ERROR |
2 bytes signed |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 .. 2147483647 |
4 bytes unsigned |
ERROR |
ERROR |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 .. 4294967295 |
4 bytes unsigned |
ERROR |
ERROR |
4 bytes unsigned |
8 bytes signed |
C++ 4 bytes unsigned
|
4 bytes unsigned |
-2147483648 .. 2147483647 |
4 bytes signed |
ERROR |
ERROR |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 ..
(263 -1) (仅限 C + +) |
8 bytes
unsigned |
ERROR |
ERROR |
ERROR |
8
bytes signed |
ERROR |
8
bytes signed |
0.. 2 64(仅限 C + +) |
8 bytes
unsigned |
ERROR |
ERROR |
ERROR |
8
bytes unsigned |
ERROR |
8
bytes unsigned |
-2 63 ..
(2 63-1)(仅限 C + +) |
8 bytes
signed |
ERROR |
ERROR |
ERROR |
8
bytes signed |
ERROR |
8
bytes signed |
示例
以下示例显示了 #pragma 枚举和编译器选项的各种用法:
- 不能在枚举声明中使用 #pragma 枚举来更改枚举的存储分配。 以下代码段生成警告,将忽略枚举选项的第二次出现:
#pragma enum ( small ) enum e_tag { a, b, #pragma enum ( int ) /* error: cannot be within a declaration */ c } e_var; #pragma enum ( pop ) /* second pop isn't required */ - 对于 C 编译器,枚举常量的范围必须属于无符号 int 或 int (有符号 int) 的范围。 对于 C++ 编译器,枚举常量的范围必须在无符号长整型或长整型 (带符号长整型) 的范围内。 例如,以下代码段在使用 C 编译器时包含错误,但在 C++ 编译器为 used.: 时将成功编译
#pragma enum ( small ) enum e_tag { a=-1, b=2147483648 /* C compiler error: larger than maximum int */ } e_var; #pragma enum ( pop ) #pragma enum ( small ) enum e_tag { a=0, b=4294967296 /* C compiler error: larger than maximum int */ } e_var; #pragma enum ( pop ) - 用于 pop 选项的一个用途是弹出包含文件末尾设置的枚举大小,该包含文件指定与主文件中的缺省值不同的枚举存储器。 例如,以下 include 文件 small_enum.h声明各种最小大小的枚举,然后将 include 文件末尾的规范重置为选项堆栈上的最后一个值:
以下源文件 int_file.c包含 small_enum.h:#ifndef small_enum_h #define small_enum_h /* * File small_enum.h * This enum must fit within an unsigned char type */ #pragma enum ( small ) enum e_tag {a, b=255}; enum e_tag u_char_e_var; /* occupies 1 byte of storage */ /* Pop the enumeration size to whatever it was before */ #pragma enum ( pop ) #endif
枚举 test_enum 和 first_order 都占用 4 字节的存储空间,类型为 int。 small_enum.h 中定义的变量 u_char_e_var 占用 1 字节的存储器,并由无符号字符数据类型表示。/* * File int_file.c * Defines 4 byte enums */ #pragma enum ( int ) enum testing {ONE, TWO, THREE}; enum testing test_enum; /* various minimum-sized enums are declared */ #include "small_enum.h" /* return to int-sized enums. small_enum.h has popped the enum size */ enum sushi {CALIF_ROLL, SALMON_ROLL, TUNA, SQUID, UNI}; enum sushi first_order = UNI; - 如果使用 ENUM = *SMALL 选项编译以下代码片段:
枚举常量的范围为 0 到 2。 此范围属于上表中描述的所有范围。 根据优先级,编译器使用预定义的无符号字符型。enum e_tag {a, b, c} e_var; - 如果使用 ENUM = *SMALL 选项编译以下代码片段:
枚举常量的范围为 -129 到 -127。 此范围仅属于 short (带符号 short) 和 int (带符号 int) 的范围。 因为 short (带符号的 short) 较小,所以它将用于表示 enum。enum e_tag {a=-129, b, c} e_var; - 如果使用以下命令编译文件 myprogram.c :
除非 #pragma 枚举伪指令覆盖 ENUM 选项,否则源文件中的所有枚举变量都将占用最小存储量。CRTBNDC MODULE(MYPROGRAM) SRCMBR(MYPROGRAM) ENUM(*SMALL) - 如果编译包含以下行的文件 yourfile.c :
使用命令:enum testing {ONE, TWO, THREE}; enum testing test_enum; #pragma enum ( small ) enum sushi {CALIF_ROLL, SALMON_ROLL, TUNA, SQUID, UNI}; enum sushi first_order = UNI; #pragma enum ( int ) enum music {ROCK, JAZZ, NEW_WAVE, CLASSICAL}; enum music listening_type;
枚举变量 test_enum 和 first_order 将最小大小 (即,每个变量仅占用 1 字节的存储器)。 另一个枚举变量 listening_type 将为 int 类型,并占用 4 字节的存储空间。CRTBNDC MODULE(YOURFILE) SRCMBR(YOURFILE)
