【问题标题】:Warning if you accidentially compare constants using boolean operators (||, &&)如果您不小心使用布尔运算符(||、&&)比较常量,则会发出警告
【发布时间】:2016-03-02 11:14:43
【问题描述】:

如果您使用带有布尔运算符的整数常量,有没有办法让 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 result = flags && 42;  // you might have meant `&`

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

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

【问题讨论】:

  • 另一个问题与我的问题重叠,实际上解决了我的 具体 问题。但是as ask 的问题是不同的......我问的是在非布尔值上使用||&&。您可能遇到“条件表达式 not 常量”的情况,或者您根本没有使用 if,我仍然想要一个警告。
  • “常量”是指constexpr(编译时常量),而不是const(动态初始化但此后不可变),对吗?
  • @BenVoigt 也不是。我的意思主要是文字,还有枚举值,是的还有constexpr,以及编译器在编译时发生的任何推断。
  • 如果编译器不能帮助你,你必须在编译时自己做检查。在枚举的情况下,包装类可以解决问题,如下所示:en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Type_Safe_Enum

标签: c++ compiler-warnings


【解决方案1】:

最新版本的 gcc 和 clang 提供了 Wint-in-bool-context 警告,可以准确检查这一点。

或者,如果你使用 C+11,你可以使用enum class

enum class MatchType {MATCHED, FAKE, DUMMY};

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多