Betrachten Sie die folgende enum- und switch-Anweisung:
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
}
};
Ich bin ein Objective-C-Programmierer, aber ich habe dies für ein breiteres Publikum in reinem C geschrieben.
Clang / LLVM 4.1 mit -Alles warnt mich in der Standardzeile:
Standardbeschriftung im Schalter, die alle Aufzählungswerte abdeckt
Jetzt kann ich irgendwie nachvollziehen, warum dies so ist: In einer perfekten Welt würden die einzigen Werte, die in das Argument theMask
eingegeben werden, in der Aufzählung stehen, sodass keine Standardwerte erforderlich sind. Aber was ist, wenn ein Hack auftaucht und ein nicht initialisiertes Int in meine schöne Funktion wirft? Meine Funktion wird als Ablage in der Bibliothek bereitgestellt, und ich habe keine Kontrolle darüber, was dort hineingelangen könnte. Verwenden default
ist eine sehr ordentliche Art, damit umzugehen.
Warum halten die LLVM-Götter dieses Verhalten für ihres teuflischen Geräts unwürdig? Sollte ich dem eine if-Anweisung voranstellen, um das Argument zu überprüfen?
-Weverything
kann nützlich sein, aber seien Sie vorsichtig, wenn Sie Ihren Code zu stark verändern, um damit umzugehen. Einige dieser Warnungen sind nicht nur wertlos, sondern auch kontraproduktiv und sollten am besten deaktiviert werden. (In der Tat, das ist der Anwendungsfall für -Weverything
: Beginnen Sie damit und deaktivieren Sie, was keinen Sinn ergibt.)
"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."
.