次のenumおよびswitchステートメントを検討してください。
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
}
};
私はObjective-Cプログラマですが、より多くの読者のために純粋なCでこれを書いています。
-Weverythingを使用したClang / LLVM 4.1では、デフォルトの行で警告が表示されます。
すべての列挙値をカバーするスイッチのデフォルトラベル
今、私はこれがなぜあるのかを見ることができます:完全な世界では、引数に入力する値theMask
は列挙型のみであるため、デフォルトは必要ありません。しかし、ハックがやって来て、初期化されていないintを美しい関数に投げ込んだらどうなるでしょうか?私の機能はライブラリのドロップとして提供され、そこに何が入るかを制御することはできません。を使用することdefault
は、これを処理する非常に適切な方法です。
なぜLLVMの神は、この振る舞いを地獄のデバイスにふさわしくないと考えているのでしょうか?引数をチェックするifステートメントをこれに先行させる必要がありますか?
-Weverything
役に立つかもしれませんが、コードを変更しすぎて対処できないように注意してください。これらの警告のいくつかは、価値がないだけでなく、逆効果であるため、オフにするのが最適です。(実際、それはユースケースです-Weverything
。まず始めて、意味をなさないものをオフにします。)
"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."
。