是否有"条件表达式不变"的gcc警告?

eth*_*ger 5 c c++ gcc android-ndk

我继承了一个相当大的代码库,不知怎的,有人编写了几个这样的条件:

enum
{
    FOO_TYPE_A,
    FOO_TYPE_B,
    FOO_TYPE_C,
    FOO_TYPE_D
};

void bar(int fooType)
{
    if (fooType == FOO_TYPE_A || FOO_TYPE_B) // <-- This will always be true, since FOO_TYPE_B is nonzero!
    {
        // Do something intended for only type A or B
    }

    // Do things general to A,B,C,D
}
Run Code Online (Sandbox Code Playgroud)

条件检查应该明确是:

    if (fooType == FOO_TYPE_A || fooType  == FOO_TYPE_B)
Run Code Online (Sandbox Code Playgroud)

在gcc中是否有警告我可以打开以找到它们,类似于MSDN的C4127

具体来说,我使用的是Android NDK r9d.

如果没有,为什么不呢?对于无意识的赋值,无符号> 0以及上述愚蠢似乎都是有用的.

编辑:使代码更详细,以说明问题.

jxh*_*jxh 2

我没有看到与 MSDN C4127 对应的警告。GCC 确实有一个警告,其意图有些相似,但不是为了解决您的问题:-Wtype-limits

由于数据类型的范围有限,如果比较始终为 true 或始终为 false,则发出警告,但不对常量表达式发出警告。例如,如果使用 或unsigned将变量与零进行比较,则会发出警告。此警告也由 启用 。<>=-Wextra

正如您所看到的,GCC 明确声明它不会对常量表达式发出警告。这样做的动机可能是由于常量表达式的常见用途是利用编译器的死代码消除功能,以便可以通过使用编译时常量来优化宏(或其部分)。它将用作条件编译(#if defined()#if X == Y)的替代方案,因为宏读起来更自然,就像常规函数一样。作为一个假设的例子:

#define VERIFY(E) \
do { \
    if (NO_VERIFY) break; \
    if (!(E) && (VERIFY_LOG_LEVEL >= log_level() || VERIFY_LOG_ALWAYS)) { \
        log("validation error for: " #E); \
    } \
} while (0)
Run Code Online (Sandbox Code Playgroud)