-qenum
适用的调用
选项 | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
---|---|---|---|---|
-qenum | ✓ | ✓ |
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表 。
类别
等效编译指示
#pragma 选项枚举, #pragma 枚举
用途
指定枚举所占用的存储量。
-qenum 选项仅影响没有固定底层类型的非范围枚举。 对于具有固定底层类型的枚举, -qenum 选项将被忽略。
语法
缺省值
-qenum=intlong
参数
- 1
- 如果枚举值的范围在
signed char
的限制内,那么指定枚举占用存储器的 1 字节,类型为signed char
,否则为unsigned char
。 - 2
- 如果枚举值的范围在
signed short
的限制内,那么指定枚举占用 2 字节的存储器,类型为short
,否则为unsigned short
。数值不能超过 的范围。
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
。 - 整数
说明枚举占用了4字节的存储空间,类型为。
int
- intlong
- 如果枚举中的值范围不能由
int
或unsigned int
之一表示,那么指定枚举占用 8 字节的存储器,与 8 子选项一样。 否则,与 4 子选项一样,枚举占用 4 字节的存储空间。 - 小型
- 指定枚举占用最小空间量 (1 , 2 , 4 或 8 字节的存储量) ,这些空间可以准确表示枚举中的值范围。 除非值的范围包含负值,否则签名为
unsigned
。 如果 8-byteenum
结果,那么所使用的实际枚举类型取决于编译方式。 - pop | reset (仅限编译指示)
- 废弃当前编译指示设置并还原为先前编译指示伪指令指定的设置。 如果未指定先前的编译指示,请还原为命令行或缺省选项设置。
使用量
下面的表显示了选择预定义类型的优先级。 该表还显示了预定义类型,对应预定义类型的
enum
常量的最大范围以及该预定义类型所需的存储量,即 sizeof
运算符应用于最小大小的 enum
时将生成的值。 除非另有说明,否则所有类型都是 signed
。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|
整数
环境。 发出严重错误,编译停止。 要更正此情况,应减小枚举范围,选择更大的 -qenum 设置,或选择动态 -qenum 设置,例如 small 或 intlong。
在根据ISO C 1989和ISO C 1999标准编译C应用程序时,枚举类型不得超过 的范围。
int
在 stdc89 | stdc99 语言级别生效的情况下,如果枚举的值超过int
的范围,并且生效的 -qenum 选项支持此值,那么编译器将按如下所示操作:- 如果 -qenum=int 生效,那么将发出严重错误消息并停止编译。
- 对于 -qenum的所有其他设置,将发出参考消息并继续编译。
- 当
-qenum=8
时,对于所有范围的枚举符值 (最多为 232-1) ,该表将底层类型标识为long long
(对于 32 位 编译方式) 和long
(对于 64 位编译方式)。 这违反了标准中的规则: 如果枚举符值适合int
或unsigned 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 */
预定义的宏
无。