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

Warning if you accidentially compare constants using boolean operators (||, &&)

本文关键字:常量 比较 警告 意外 布尔 运算符 如果      更新时间:2023-10-16

如果将整数常量与布尔运算符一起使用,有没有办法让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是正确的做法,可以防止这种错误,但我仍然对答案感兴趣。)

类似的问题"条件表达式为常量是否有gcc警告"集中在if中的表达式在简化后为常量的情况下。我问的是在非布尔常量上使用布尔运算符的情况,例如:

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

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

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

gcc和clang的最新版本提供了Wint-in-bool-context警告,该警告正是用来检查这一点的。

或者,如果您使用的是C+11,则可以使用enum class

enum class MatchType {MATCHED, FAKE, DUMMY};

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

enum class提供了比普通enum更好的类型安全性。请参阅为什么枚举类优先于普通枚举?