如果您使用布尔运算符(||,&&)意外地比较常量,则发出警告

时间:2015-11-28 12:06:34

标签: c++ compiler-warnings

如果你使用整数常量和布尔运算符,有没有办法让clang(或gcc)警告你?具体(但不仅仅)在if上下文中?

我的意思是,我写道:

enum MatchType {MATCHED, FAKE, DUMMY};

if (matchType == MatchType::FAKE || MatchType::DUMMY) {
    // ...
}

应该在哪里

if (matchType == MatchType::FAKE || matchType == MatchType::DUMMY) {

使用常量的OR运算显然没有意义(特别是当它不是文字0或1时)。知道如何防止这种情况吗? (我知道在这个特定情况下使用switch是正确的做法,并且可以防止这种错误,但我仍然对答案感兴趣。)

类似的问题"is there a gcc warning for conditional expression is constant"主要关注的是if中的表达式 - 在简化后 - 是常量。我问的是你在非bool常量上使用布尔运算符的情况,例如:

bool result = flags && 42;  // you might have meant `&`

此外,在这种情况下,条件表达式常量(取决于a),但它可能仍然是一个错误:

if (a == 5 && 6) { /*...*/ }

1 个答案:

答案 0 :(得分:0)

gcc和clang的最新版本提供了- name: Include var of dest_file.yml into the new_var include_vars: file: dest_file.yml name: new_var 警告,可以对此进行检查。

或者,如果您使用的是C + 11,则可以使用Wint-in-bool-context

enum class

(我假设您的编译器支持C ++ 11,因为您使用的是enum class MatchType {MATCHED, FAKE, DUMMY}; 而不是MatchType::FAKE来引用枚举)

FAKE比普通enum class提供更好的类型安全性。参见Why is enum class preferred over plain enum?