Considere a seguinte enumeração e instrução 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
}
};
Sou um programador de Objective-C, mas escrevi isso em C puro para um público mais amplo.
Clang / LLVM 4.1 com -Weverything me avisa na linha padrão:
Etiqueta padrão na opção que cobre todos os valores de enumeração
Agora, eu posso ver por que isso existe: em um mundo perfeito, os únicos valores inseridos no argumento theMask
seriam enum, portanto, nenhum padrão é necessário. Mas e se algum hack surgir e lançar um int não inicializado em minha bela função? Minha função será fornecida como uma gota na biblioteca e não tenho controle sobre o que poderia acontecer lá. Usar default
é uma maneira muito elegante de lidar com isso.
Por que os deuses LLVM consideram esse comportamento indigno de seu dispositivo infernal? Devo estar precedendo isso por uma instrução if para verificar o argumento?
-Weverything
pode ser útil, mas tenha cuidado ao alterar muito seu código para lidar com ele. Alguns desses avisos não são apenas inúteis, mas contraproducentes e são melhor desativados. (Na verdade, esse é o caso de uso para -Weverything
: começar com ele, e desligar o que não faz sentido.)
"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."
.