Considere la siguiente instrucción enum y 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
}
};
Soy un programador de Objective-C, pero he escrito esto en C puro para un público más amplio.
Clang / LLVM 4.1 con -Weverything me advierte en la línea predeterminada:
Etiqueta predeterminada en el interruptor que cubre todos los valores de enumeración
Ahora, puedo ver por qué esto está ahí: en un mundo perfecto, los únicos valores que entran en el argumento theMask
estarían en la enumeración, por lo que no es necesario ningún valor predeterminado. Pero, ¿qué pasa si aparece algún truco y arroja un int no inicializado a mi hermosa función? Mi función se proporcionará como una caída en la biblioteca, y no tengo control sobre lo que podría entrar allí. Usar default
es una forma muy ordenada de manejar esto.
¿Por qué los dioses LLVM consideran este comportamiento indigno de su dispositivo infernal? ¿Debería estar precediendo esto por una declaración if para verificar el argumento?
-Weverything
puede ser útil, pero tenga cuidado al mutar demasiado su código para lidiar con él. Algunas de esas advertencias no solo son inútiles sino contraproducentes, y es mejor desactivarlas. (De hecho, ese es el caso de uso -Weverything
: comience con él y apague lo que no tiene 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."
.