Considera la seguente enum e switch statement:
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
}
};
Sono un programmatore di Objective-C, ma l'ho scritto in puro C per un pubblico più ampio.
Clang / LLVM 4.1 con -Weverything mi avvisa sulla riga predefinita:
Etichetta predefinita nello switch che copre tutti i valori di enumerazione
Ora posso capire perché questo è lì: in un mondo perfetto, gli unici valori che entrano nell'argomento theMask
sarebbero nell'enum, quindi non è necessario alcun default. Ma cosa succede se arriva qualche hack e lancia un int non inizializzato nella mia bella funzione? La mia funzione verrà fornita come drop nella libreria e non ho alcun controllo su cosa potrebbe andare lì. L'utilizzo default
è un modo molto semplice di gestirlo.
Perché gli dei LLVM ritengono questo comportamento indegno del loro dispositivo infernale? Dovrei essere preceduto da un'istruzione if per verificare l'argomento?
-Weverything
può essere utile, ma fai attenzione a non modificare troppo il codice per gestirlo. Alcuni di questi avvertimenti non sono solo inutili ma controproducenti e sono meglio disattivati. (In effetti, questo è il caso d'uso di -Weverything
: iniziare con questo e disattivare ciò che non ha senso.)
"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."
.