我有这个enum class
:
enum class myEnum : u8{
LEVEL_ERROR = 0,
LEVEL_WARN = 50,
LEVEL_DEBUG = 150,
};
有时我会使用它(不完全是这种方式,只是发生了这种情况):
myEnum instance = 42;
printf("My enum is now: %u", instance);
编辑:当然可以这样使用:myEnum instance = (myEnum)42;
打印值有时是298
,有时是126657066
,但决不是42
。因此,我注意到所有这些“随机”数字都是我的值,但用3个字节填充(堆栈?)-42 = 0x2A
,298 = 0x12A
和126657066 = 0x78CA22A
。我知道我的类型将被提升为int类型,但是在无符号变量类型的情况下,应该用3个字节的“ 0”填充它。那么为什么要填充垃圾呢?
答案 0 :(得分:1)
您的类型未提升为int
。整数促销适用于枚举类型为 的变量参数列表参数,如果它们要接受整数促销[expr.call]/12。问题在于整数提升仅适用于无范围的枚举[conv.prom]。您的enum class
是一个范围枚举。因此,由于参数类型和格式字符串中指定的类型之间不匹配,该值将不会被提升,并且您对printf
的调用具有未定义的行为(也如上所述)。您将必须将值显式转换为所需的整数类型,或者将enum class
更改为无范围的枚举…