枚举类-printf输出错误的值

时间:2019-04-05 14:14:46

标签: c++ c++11 printf integer-promotion

我有这个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 = 0x2A298 = 0x12A126657066 = 0x78CA22A。我知道我的类型将被提升为int类型,但是在无符号变量类型的情况下,应该用3个字节的“ 0”填充它。那么为什么要填充垃圾呢?

1 个答案:

答案 0 :(得分:1)

您的类型未提升为int。整数促销适用于枚举类型为 的变量参数列表参数,如果它们要接受整数促销[expr.call]/12。问题在于整数提升仅适用于无范围的枚举[conv.prom]。您的enum class是一个范围枚举。因此,由于参数类型和格式字符串中指定的类型之间不匹配,该值将不会被提升,并且您对printf的调用具有未定义的行为(也如上所述)。您将必须将值显式转换为所需的整数类型,或者将enum class更改为无范围的枚举…