Если переключатель с аргументом типа enum пропускает некоторые константы и не имеет ветки по умолчанию, параметр gcc -Wswitch
вызывает предупреждение вроде
warning: enumeration value 'WHATEVER' not handled in switch
Тем не менее, многие наши переключатели похожи на:
enum foo {
FOO_ONE,
FOO_TWO,
FOO_COUNT
};
где FOO_COUNT никогда не появляется как значение, но используется для определения количества значений, которые определены и могут появиться в переменной. Потому что мы индексируем массив со значением перечисления или упаковываем его побитно, и нам нужно проверить, подойдет ли он или что-то в этом роде. Таким образом, перечисление, которое обрабатывает все значения, должно не включать эту одну константу. Есть ли способ сохранить это предупреждение, но избежать его для таких особых значений? т.е.
switch(foo) {
case FOO_ONE:
anything;
};
должен дать предупреждение, но:
switch(foo) {
case FOO_ONE:
anything;
case FOO_TWO:
anything_else;
}
не следует.
foo f = FOO_COUNT;
, но вы дали им средства для этого. Я полагаю, вы не хотите писатьstatic const int FOO_COUNT = FOO_TWO+1;
после перечисления или даже#define FOO_COUNT (FOO_TWO+1)
внутри перечисления из-за риска того, что вы забудете обновить его при добавлении FOO_THREE? - person Steve Jessop   schedule 24.08.2012FOO_LAST = FOO_TWO
в перечисление. Это не добавит новое значение в перечисление, и вы избежите загрязнения пространства имен препроцессора (а в С++FOO_LAST
будет в правильном пространстве имен). - person user2224044   schedule 08.04.2021