Rozważ następującą instrukcję wyliczania i przełączania:
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
}
};
Jestem programistą Objective-C, ale napisałem to w czystym C dla szerszej publiczności.
Clang / LLVM 4.1 z -Wszystko ostrzega mnie w domyślnej linii:
Domyślna etykieta w przełączniku, która obejmuje wszystkie wartości wyliczeń
Teraz rozumiem, dlaczego tak jest: w idealnym świecie jedynymi wartościami wprowadzanymi do argumentu theMask
byłyby wyliczenie, więc żadne domyślne nie jest konieczne. Ale co jeśli jakiś hack pojawi się i wrzuci niezainicjowaną int do mojej pięknej funkcji? Moja funkcja zostanie udostępniona jako zrzut w bibliotece i nie mam kontroli nad tym, co może się tam znaleźć. Używanie default
jest bardzo zgrabnym sposobem radzenia sobie z tym.
Dlaczego bogowie LLVM uważają to zachowanie za niegodne ich piekielnego urządzenia? Czy powinienem poprzedzać to instrukcją if, aby sprawdzić argument?
-Weverything
może być przydatny, ale należy uważać na zbyt częste mutowanie kodu, aby sobie z tym poradzić. Niektóre z tych ostrzeżeń są nie tylko bezwartościowe, ale przynoszą efekt przeciwny do zamierzonego i najlepiej je wyłączyć. (Rzeczywiście, taki jest przypadek użycia -Weverything
: zacznij od włączenia i wyłącz to, co nie ma sensu.)
"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."
.