Недавно я обновился до нового компилятора 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
...
Интересно, есть ли более элегантный способ решения этого вопроса.