Рассмотрим следующий оператор enum и switch:
typedef enum {
MaskValueUno,
MaskValueDos
} testingMask;
void myFunction(testingMask theMask) {
switch (theMask) {
case MaskValueUno: {}// deal with it
case MaskValueDos: {}// deal with it
default: {} //deal with an unexpected or uninitialized value
}
};
Я программист на Objective-C, но я написал это на чистом C для более широкой аудитории.
Clang / LLVM 4.1 с -Weverything предупреждает меня в строке по умолчанию:
Метка по умолчанию в switch, которая охватывает все значения перечисления
Теперь я могу понять, почему это так: в идеальном мире единственными значениями, входящими в аргумент theMask
, являются перечисления, поэтому по умолчанию не требуется. Но что, если какой-то хак придет и бросит неинициализированный int в мою прекрасную функцию? Моя функция будет предоставлена в виде библиотеки, и я не буду контролировать, что там будет. Использование default
- очень аккуратный способ справиться с этим.
Почему боги LLVM считают такое поведение недостойным своего адского устройства? Должен ли я предшествовать этому оператору if, чтобы проверить аргумент?
-Weverything
может быть полезным, но будьте осторожны с изменением кода, чтобы справиться с ним. Некоторые из этих предупреждений не только бесполезны, но и неэффективны, и их лучше отключать. (Действительно, это тот случай использования -Weverything
: начните с него и выключите то, что не имеет смысла.)
"Pro tip: Try setting the -Weverything flag and checking the “Treat Warnings as Errors” box your build settings. This turns on Hard Mode in Xcode."
.