Aşağıdaki enum ve switch deyimini göz önünde bulundurun:
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
}
};
Ben bir Objective-C programcısıyım, ancak bunu daha geniş bir kitleye C saf yazdım.
-Weverything olan Clang / LLVM 4.1, beni varsayılan satırda uyarır:
Tüm numaralandırma değerlerini kapsayan anahtardaki varsayılan etiket
Şimdi, bunun neden orada olduğunu görebiliyorum: mükemmel bir dünyada, tartışmaya giren tek değerler enumda theMask
olacaktı, bu nedenle varsayılan gerekmiyor. Peki ya bazı kesmek ortaya çıkar ve güzel işlevime başlatılmamış bir int atarsa? İşlevim kütüphanede bir düşüş olarak sağlanacak ve orada neler olabileceği üzerinde hiçbir kontrolüm yok. Kullanmak default
, bunu ele almanın çok temiz bir yoludur.
LLVM tanrıları neden bu davranışı infernal cihazlarının değersiz görmektedir? Argümanı kontrol etmek için bundan önce bir if ifadesiyle mi başlamalıyım?
-Weverything
faydalı olabilir, ancak kodunuzu değiştirmek için çok fazla mutasyona dikkat edin. Bu uyarıların bazıları sadece değersiz değil, aynı zamanda karşı-üretken ve en iyi şekilde kapatılmış. (Gerçekten de, bunun için kullanım örneği -Weverything
: onunla başla ve mantıklı olmayan şeyleri kapat.)
"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."
.