Подтвердить что ты не робот

Предупреждение: регистр не оценивается в перечисляемом типе?

Недавно я обновился до нового компилятора Clang LLVM 4.0 и его приятного. Именно в этом случае он показывает мне уродливое предупреждение о каком-то старом устаревшем коде:

Предупреждение: case value not in enumerated type 'SomeConstants' (aka 'enum SomeConstants') [-Wswitch]

switch (var) {
    case kConstant: case 3: case 4: case 8: case 35: //WARNING HERE :(
    // do my thing here
    break;
    case kOtherConstant:
    // do another thing here
    break;
    default:
    break;
}

var может быть одним из значений, определенных в перечислении что-то вроде этого:

typedef enum SomeConstants {
    kConstant,
    kOtherConstant,
};

и, как вы видите, 2, 4, 8, 35 не определены (поэтому компилятор усложняет), но на самом деле они происходят (это одна из неясных частей этой закрытой исходной библиотеки, которую я использую).

Можно ли каким-то образом изменить код переключения, чтобы я не получил безобидное, но раздражающее предупреждение? Сейчас я замолчал, используя:

switch (var) {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wswitch"
    case kConstant: case 3: case 4: case 8: case 35:
#pragma GCC diagnostic pop
    ...

Интересно, есть ли более элегантный способ решения этого вопроса.

4b9b3361

Ответ 1

Вы можете выразить выражение оператора switch() на int, чтобы он не выполнял/не выполнял эту проверку.

В конце концов, он фактически используется для хранения значения int, а не одного из перечисленных перечислений.