枚举值

C编译器

枚举语法

读取语法图跳过可视语法图#pragmaenum( 124intsmallpopsystem_defaultuser_default )
C++ 编译器

枚举语法

读取语法图跳过可视语法图#pragmaenum( 1248intintlongsmallpopsystem_defaultuser_default )

描述

指定编译器用于表示枚举的字节数。 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 编译器选项指定的枚举大小。

枚举设置可接受的值范围如下所示:

表 1. 枚举设置接受的值范围
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

C ERROR

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 枚举和编译器选项的各种用法:
  1. 不能在枚举声明中使用 #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 */ 
  2. 对于 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 )
  3. 用于 pop 选项的一个用途是弹出包含文件末尾设置的枚举大小,该包含文件指定与主文件中的缺省值不同的枚举存储器。 例如,以下 include 文件 small_enum.h声明各种最小大小的枚举,然后将 include 文件末尾的规范重置为选项堆栈上的最后一个值:
    #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
    以下源文件 int_file.c包含 small_enum.h:
    /*
     * 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;
    枚举 test_enum 和 first_order 都占用 4 字节的存储空间,类型为 int。 small_enum.h 中定义的变量 u_char_e_var 占用 1 字节的存储器,并由无符号字符数据类型表示。
  4. 如果使用 ENUM = *SMALL 选项编译以下代码片段:
    enum e_tag {a, b, c} e_var;
    枚举常量的范围为 0 到 2。 此范围属于上表中描述的所有范围。 根据优先级,编译器使用预定义的无符号字符型。
  5. 如果使用 ENUM = *SMALL 选项编译以下代码片段:
    enum e_tag {a=-129, b, c} e_var;
    枚举常量的范围为 -129 到 -127。 此范围仅属于 short (带符号 short) 和 int (带符号 int) 的范围。 因为 short (带符号的 short) 较小,所以它将用于表示 enum。
  6. 如果使用以下命令编译文件 myprogram.c :
    CRTBNDC MODULE(MYPROGRAM) SRCMBR(MYPROGRAM) ENUM(*SMALL)
    除非 #pragma 枚举伪指令覆盖 ENUM 选项,否则源文件中的所有枚举变量都将占用最小存储量。
  7. 如果编译包含以下行的文件 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;
    使用命令:
    CRTBNDC MODULE(YOURFILE) SRCMBR(YOURFILE)
    枚举变量 test_enum 和 first_order 将最小大小 (即,每个变量仅占用 1 字节的存储器)。 另一个枚举变量 listening_type 将为 int 类型,并占用 4 字节的存储空间。