【发布时间】:2013-08-09 13:51:09
【问题描述】:
当使用if 中的隐式转换(例如if(25.0))时,有什么方法可以让gcc 或g++ 发出警告?
这个问题的灵感来自我最近观察到的一个错误,其中括号被错误放置,if 语句具有以下示例所示的意外行为。
我从this discussion on the comma operator 了解到这是有效的(虽然丑陋的)代码,但我想得到一个警告。
我尝试了-Wconversion -Wall -pedantic 和g++ (GCC) 4.1.2 和g++ (GCC) 4.6.3,但没有任何运气。
#include <cstdio>
bool passMin(float val, float minval=10.) {return minval<val;}
int main () {
float val(20.0), minval(25.0);
if(passMin(val), minval) printf(" pass (p( ), )"); else printf(" fail (p( ), )");
printf("\n");
if(passMin(val, minval)) printf(" pass (p( , ))"); else printf(" fail (p( , ))");
printf("\n");
}
这会产生:
pass (p( ), )
fail (p( , ))
【问题讨论】:
-
不确定这很容易做到,因为(可能)在某些情况下这是用来实现(某事)的。不使用默认值是个好主意... ;)
-
你试过 Wextra 吗?
-
@Vincent 是的,没有运气:-(
-
clang会给你一个很好的警告,看到它live,所以如果使用clang是一个选项,那么你可能会很幸运。 -
在这种特殊情况下,GCC 警告
-Wfloat-equal会覆盖它。该警告是关于精确比较的,其中一个操作数是浮点类型。在if语句中使用浮点值执行与零的精确比较。