Отключить предупреждение компилятора для операторов switch / case с использованием перечислений

Допустим, у вас есть тип перечисления с 50+ записями для его значения. Были случаи, когда я ранее переключал / обрабатывал значение enum с таким количеством записей, но только для проверки, скажем, от 2 до 5 записей из этого.

Например, OpenGL помещает большинство своих перечислений в один тип перечисления, называемый GLenum, Эти значения варьируются от GL_VERTEX_SHADER в GL_STREAM_DRAW в GL_TRIANGLES в GL_ARRAY_BUFFER, так далее.

Как вы можете видеть, хотя они связаны с точки зрения общей картины, контекст, в котором они будут использоваться, не связан друг с другом.

Я генерировал предупреждения на MinGW / GCC в Linux, где каждое предупреждение учитывает каждый перечислимое значение указано в его объявлении типа. Я не уверен, что это произойдет на VC ++, но я решил, что в любом случае учту это на всякий случай.

Другими словами, количество сгенерированных предупреждений TotalEnumValues - AmountOfCaseStatements для каждого значения перечисления, при условии, что не все перечисления были учтены в самом утверждении, которое Можно легко привести к более 100 предупреждениям компилятора, если ваш тип перечисления содержит не менее 100 записей.

Я часто использовал if / else, чтобы приспособиться к этому, но при проверке значений перечисления не только один entry (что, честно говоря, довольно редко, так как для целей перечислений в общем случае требуется условная логика, чтобы дополнить его), я всегда был склонен к использованию switch / case, так как я нахожу его более эстетичным (даже если он просто компилируется в в любом случае заявление if / else;))

Так можно ли отключить это предупреждение? Если так, то как?

0

Решение

Добавить default: дело, которое ничего не делает. Компилятор увидит, что вы «обрабатываете» все возможности (таким образом удаляя предупреждение), но он не изменит вообще сгенерированный код, если вы не укажете для него никаких действий.


Чтобы уточнить: я говорю об этом:

switch(a)
{
case CONSTANT_1:
...
break;
case CONSTANT_2:
...
break;
}

против этого:

switch(a)
{
case CONSTANT_1:
...
break;
case CONSTANT_2:
...
break;
default:
}

второй не модифицирует совсем поведение, поэтому компилятор не должен изменять сгенерированный код, но скажет ему, что вы не забыли о других (im) возможных случаях.

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]