如果使用gcc
中的隐式转换(例如g++
),有if
或if(25.0)
发出警告的方式吗?
这个问题的灵感来自我最近观察到的错误放置括号的错误,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( , ))
答案 0 :(得分:1)
在C和C ++中,所有表达式基本上都被评估为逻辑表达式:true还是false? true是任何非零值,而false是零。
正在发生的事情是你的表达
if(passMin(val), minval)
正在使,
运算符犯规,该运算符计算左侧的表达式并丢弃结果,然后继续评估右侧的表达式并返回该值。
逗号运算符具有任何运算符的最低优先级,并且是左关联的。
基本上,上面的代码意味着
void(passMin(val));
if (minVal)
任何当前编译器都不太可能提供限制此模式的选项,因为它非常广泛地用于指针和零检查之类的事情:
for (Node* node = list->head; node; node = node->next)
...
void func(const char* str) {
assert(str);
...
因此,如果你做了有一个选项,你可能会削弱大多数库,STL,提升等。
也就是说,您可以使用静态分析器来强制执行在您自己的代码中禁止它的代码实践。
Visual studio:http://msdn.microsoft.com/en-us/library/dd380660.aspx
Clang静态分析器:http://clang-analyzer.llvm.org/(页面不是很有用,分析器似乎附带3.5,因此需要额外的搜索才能找到更好的文档)