gpt4 book ai didi

c++ - 让 gcc 在 if 内对转换发出警告

转载 作者:太空狗 更新时间:2023-10-29 23:05:44 25 4
gpt4 key购买 nike

gccg++if 中进行隐式转换时是否有任何方法发出警告,例如 if (25.0),是用的吗?

这个问题的灵感来自于我最近观察到的一个错误,其中括号被错误放置,并且 if 语句具有下面示例中说明的意外行为。我从this discussion on the comma operator了解到这是有效的(虽然丑陋)代码,但我想得到一个警告。我用 g++ (GCC) 4.1.2g++ (GCC) 4.6.3 尝试了 -Wconversion -Wall -pedantic 但没有任何运气。

#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( , ))

最佳答案

在 C 和 C++ 中,所有表达式本质上都被评估为逻辑表达式:真还是假? 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、boost 等。

也就是说,您可能会使用静态分析器来强制执行在您自己的代码中禁止它的代码实践。

Visual Studio :http://msdn.microsoft.com/en-us/library/dd380660.aspx

Clang 静态分析器:http://clang-analyzer.llvm.org/ (该页面并不是那么有用,分析器似乎带有 3.5,因此需要进行额外的搜索才能找到更好的文档)

关于c++ - 让 gcc 在 if 内对转换发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18148267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com