如果您意外地使用布尔运算符 (||, &&) 比较常量,则发出警告
Warning if you accidentially compare constants using boolean operators (||, &&)
如果将整数常量与布尔运算符一起使用,有没有办法让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
更好的类型安全性。请参阅为什么枚举类优先于普通枚举?
相关文章:
- 禁止显示由于常量为零而比较始终为假的警告
- 将收到的 usart uint8_t* 数据与常量字符串进行比较
- C++,如何使用常量对象和非常量对象进行比较?
- 为什么 std::stable_sort() 的比较函数的参数必须是设置常量?
- 可作为常量调用的比较对象
- C++中是否有任何常量可以用作比较中的最小值/最大值
- 为什么常量字符[]和常量字符*之间的比较不同
- 比较字符和常量字符串
- 如何在 C++ 类中重载 'less than' 运算符以比较常量?
- 将非静态数据成员与常量成员进行比较
- 比较字符和常量字符
- 比较常量字符* 与字符(无法使用 strcmp 进行比较)刽子手游戏
- 将常量和变量与左边的常量进行比较有什么好处
- 私有成员的常量访问器之间的比较
- C++中易失性成员函数与常量成员函数的比较
- c++omp,比较参数和常量
- 如何举例来反驳“==”用于比较“常量字符*”的用法
- 将浮点数与常量进行比较时出现奇怪的行为
- 为什么我不能在没有常量的情况下定义比较
- 常量字符* if() 与 "SRAD" 的比较返回 false