考虑以下枚举和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
将在枚举中,因此不需要默认值。但是,如果出现一些hack并将未初始化的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."
。