【发布时间】: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