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 theMasksarebbero 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?
-Weverythingpuò 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.".