enum class - printf печатает неверное значение - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть 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" в случае типа переменной без знака. Так почему же там мусор?

1 Ответ

1 голос
/ 05 апреля 2019

Ваш тип не повышен до int.Целочисленные продвижения применяются к переменным спискам аргументов типа перечисления , если они подлежат целочисленным продвижениям [expr.call] / 12 .Проблема заключается в том, что целочисленные повышения применяются только к перечислениям с незаданной областью [conv.prom] .Ваш enum class - это перечисление в области видимости.Поэтому значение не будет продвигаться, и ваш вызов printf будет иметь неопределенное поведение из-за несоответствия между типом аргумента и типом, указанным в строке формата (как также объяснено в комментариях выше).Вам придется либо явно привести значение к целочисленному типу, который вы хотите, либо изменить enum class на перечисление с незаданной областью ...

...