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

时间:2014-04-04 02:19:10

标签: 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
}

条件检查应该明确是:

    if (fooType == FOO_TYPE_A || fooType  == FOO_TYPE_B)

gcc中是否有警告我可以打开以查找所有内容,类似于MSDN&#39; C4127

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

如果没有,为什么不呢?对于无意识的分配来说,这似乎是一个有用的全部,无符号&gt; 0以及上面的愚蠢。

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

2 个答案:

答案 0 :(得分:2)

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

  

如果比较始终为真或因总是假,则发出警告   有限范围的数据类型,但不要警告恒定   表达式。例如,警告是否比较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)

答案 1 :(得分:-1)

我认为问题在于变量是一个定义或一个const。 CONSTANT_2是一个非零常数也会产生这个问题。