-qenum

适用的调用

表 1. 接受给定选项的调用
选项 xlc (编译 C) xlC (编译 C++) xlclang(编译 C) xlclang++(编译 C++)
-qenum    
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表

类别

浮点和整数控件

等效编译指示

#pragma 选项枚举, #pragma 枚举

用途

指定枚举所占用的存储量。

C++11 -qenum 选项仅影响没有固定底层类型的非范围枚举。 对于具有固定底层类型的枚举, -qenum 选项将被忽略。C++11

语法

操作语法

读取语法图跳过可视语法图 -qenum= intlongintsmall1248

编译指示语法

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

缺省值

-qenum=intlong

参数

1
如果枚举值的范围在 signed char的限制内,那么指定枚举占用存储器的 1 字节,类型为 signed char ,否则为 unsigned char
2
如果枚举值的范围在 signed short的限制内,那么指定枚举占用 2 字节的存储器,类型为 short ,否则为 unsigned short仅 C。 数值不能超过 的范围。 signed int
4
如果枚举值的范围在 signed int的限制内,那么指定枚举占用 4 字节的存储器,类型为 int ,否则为 unsigned int
8
指定枚举占用 8 字节的存储空间。32 位 编译方式下,如果枚举值的范围在 signed long long的限制内,那么枚举的类型为 long long ,否则为 unsigned long long 在 64 位编译方式下,如果枚举值的范围在 signed long的限制内,那么枚举的类型为 long ,否则为 unsigned long
整数
仅限 C 说明枚举占用了4字节的存储空间,类型为。 int
仅限 C + + 说明枚举占用的存储空间为4字节,类型为 ,如果枚举值的范围在 的范围内,则为。 int signed int unsigned int
intlong
如果枚举中的值范围不能由 intunsigned int之一表示,那么指定枚举占用 8 字节的存储器,与 8 子选项一样。 否则,与 4 子选项一样,枚举占用 4 字节的存储空间。
小型
指定枚举占用最小空间量 (1 , 2 , 4 或 8 字节的存储量) ,这些空间可以准确表示枚举中的值范围。 除非值的范围包含负值,否则签名为 unsigned如果 8-byte enum 结果,那么所使用的实际枚举类型取决于编译方式。
pop | reset (仅限编译指示)
废弃当前编译指示设置并还原为先前编译指示伪指令指定的设置。 如果未指定先前的编译指示,请还原为命令行或缺省选项设置。

使用量

下面的表显示了选择预定义类型的优先级。 该表还显示了预定义类型,对应预定义类型的 enum 常量的最大范围以及该预定义类型所需的存储量,即 sizeof 运算符应用于最小大小的 enum时将生成的值。 除非另有说明,否则所有类型都是 signed
表 2。 枚举大小和类型
  enum=1 enum=2 enum=4 enum=8
32 位 编译方式 64 位编译方式
范围 var const var const var const var const var const
0..127 有符号字符型 整数 简短 整数 整数 整数 long long long long 长整型 长整型
-128..127 有符号字符型 整数 简短 整数 整数 整数 long long long long 长整型 长整型
0..255 无符号字符 整数 简短 整数 整数 整数 long long long long 长整型 长整型
0..32767 错误1 整数 简短 整数 整数 整数 long long long long 长整型 长整型
-32768..32767 错误1 整数 简短 整数 整数 整数 long long long long 长整型 长整型
0..65535 错误1 整数 unsigned short 整数 整数 整数 long long long long 长整型 长整型
0..2147483647 错误1 整数 错误1 整数 整数 整数 long long long long 长整型 长整型
-(2147483647+1) ..2147483647 错误1 整数 错误1 整数 整数 整数 long long long long 长整型 长整型
0..4294967295 错误1 无符号整数2 错误1 无符号整数2 无符号整数2 无符号整数2 long long long long 长整型 长整型
0 .. (263-1) 错误1 2 错误1 2 错误1 2 长整型2 长整型2 2 2
-2 63..(2 63 -1) 错误1 2 错误1 2 错误1 2 长整型2 长整型2 2 2
0..264 错误1 无符号长2 错误1 无符号长2 错误1 无符号长2 无符号长整型2 无符号长整型2 无符号长2 无符号长2
  枚举 = 整数 枚举 = intlong 枚举 = 小型
32 位 编译方式 64 位编译方式 32 位 编译方式 64 位编译方式
范围 var const var const var const var const var const
0..127 整数 整数 整数 整数 整数 整数 无符号字符 整数 无符号字符 整数
-128..127 整数 整数 整数 整数 整数 整数 有符号字符型 整数 有符号字符型 整数
0..255 整数 整数 整数 整数 整数 整数 无符号字符 整数 无符号字符 整数
0..32767 整数 整数 整数 整数 整数 整数 unsigned short 整数 unsigned short 整数
-32768..32767 整数 整数 整数 整数 整数 整数 简短 整数 简短 整数
0..65535 整数 整数 整数 整数 整数 整数 unsigned short 整数 unsigned short 整数
0..2147483647 整数 整数 整数 整数 整数 整数 unsigned int unsigned int unsigned int unsigned int
-(2147483647+1) ..2147483647 整数 整数 整数 整数 整数 整数 整数 整数 整数 整数
0..4294967295 无符号整数1 无符号整数2 无符号整数2 无符号整数2 无符号整数2 无符号整数2 无符号整数2 无符号整数2 无符号整数2 无符号整数2
0 .. (263-1) ERR2 ERR2 长整型2 长整型2 2 2 无符号长整型2 无符号长整型2 无符号长2 无符号长2
-2 63..(2 63 -1) ERR2 ERR2 长整型2 长整型2 2 2 长整型2 长整型2 2 2
0..264 ERR2 ERR2 无符号长整型2 无符号长整型2 无符号长2 无符号长2 无符号长整型2 无符号长整型2 无符号长2 无符号长2
备注信息:
  • 这些枚举对于 -qenum=1|2|4|仅限 C整数 仅限 C 环境。 发出严重错误,编译停止。 要更正此情况,应减小枚举范围,选择更大的 -qenum 设置,或选择动态 -qenum 设置,例如 smallintlong
  • 仅限 C 在根据ISO C 1989和ISO C 1999标准编译C应用程序时,枚举类型不得超过 的范围。 intstdc89 | stdc99 语言级别生效的情况下,如果枚举的值超过 int 的范围,并且生效的 -qenum 选项支持此值,那么编译器将按如下所示操作:
    • 如果 -qenum=int 生效,那么将发出严重错误消息并停止编译。
    • 对于 -qenum的所有其他设置,将发出参考消息并继续编译。
  • -qenum=8时,对于所有范围的枚举符值 (最多为 232-1) ,该表将底层类型标识为 long long (对于 32 位 编译方式) 和 long (对于 64 位编译方式)。 这违反了标准中的规则: 如果枚举符值适合 intunsigned int,那么底层类型不应大于 int
  • -qenum=small时,对于具有至少一个值大于 65535的枚举符的 0-2147483647 范围内的枚举符,该表标识要为 unsigned int的底层类型,无法将其提升到 int。 这违反了标准中的规则: 提升可以是 int,因为它可以保存 0-2147483647 范围内的枚举值。

#pragma enum 伪指令必须在后面的 enum 变量的声明之前; 在声明中出现的任何伪指令都将被忽略并诊断为警告。

对于放入源文件中的每个 #pragma enum 伪指令,最好在该文件末尾之前具有相应的 #pragma enum=reset 。 这将阻止一个文件可能更改包含该文件的另一个文件的设置。

示例

如果使用 enum=small 选项编译以下片段:
enum e_tag {a, b, c} e_var;
枚举常量的范围为 0 到 2。 此范围属于上表中描述的所有范围。 根据优先级,编译器使用预定义类型 unsigned char
如果使用 enum=small 选项编译以下片段:
enum e_tag {a=-129, b, c} e_var;
枚举常量的范围为 -129 至 -127。 此范围仅在 short (signed short)int (signed int)范围内。 由于 short (signed short) 较小,因此它将用于表示 enum
以下代码段将生成警告,并且将忽略第二次出现的 enum 编译指示:
#pragma enum(small)
enum e_tag {
  a,
  b,
  #pragma enum(int) /* error: cannot be within a declaration */ 
  c
} e_var;
#pragma enum(reset)
#pragma enum(reset) /* second reset isn't required */

预定义的宏

无。