我正面临需要cppchecks通过的情况,但有时会变得棘手。在这种情况下,您通常会做什么? 例如。
#include<iostream>
using namespace std;
void fun1();
int fun2();
int main()
{
fun1();
}
void fun1()
{
int retVal;
if (-1 == (retVal = fun2()))
{
cout <<"Failure. fun2 returned a -1"<< endl;
}
}
int fun2()
{
return -1;
}
我们通常会看到上述代码。以上文件的cppcheck将给出如下输出-
cppcheck --suppress = redundantAssignment --enable ='警告,样式,性能,便携性'--inline-suppr --language ='c ++'retval_neverused.cpp检查retval_neverused.cpp ... [retval_neverused.cpp:13]:(样式)变量'retVal'被分配了一个 从未使用过的值。
我不想仅仅为了cppcheck而添加一些虚拟行打印retVal。实际上,这可能是我抛出异常并且不希望异常中包含retVal的值的琐碎情况。
答案 0 :(得分:5)
CppCheck虽然还不错。您根本不需要retVal。只需直接检查fun2
的返回值即可:if( -1 == fun2() )
顺便说一句,在条件表达式中分配变量确实是一种不好的做法。在原本要输入==
但实际上要输入=
的地方输入错字会变得更加困难。
答案 1 :(得分:4)
您可以改写为:
const int retval = fun2();
if (retval == -1)
恕我直言,这项技术更易于调试,因为您可以使用调试器看到在执行fun2
语句之前从if
返回的值。
使用if
表达式中的函数调用进行调试要复杂些,以查看该函数的返回值。
答案 2 :(得分:2)
一种常见的方式是使用类似这样的东西:
#define OK_UNUSED(x) (void)x
void fun1()
{
int retVal;
if (-1 == (retVal = fun2()))
{
OK_UNUSED (retVal);
cout <<"Failure. fun2 returned a -1"<< endl;
}
}
这向人们表明retVal
是有意未使用的,并且使CppCheck认为它已被使用,从而抑制了警告。
请注意,如果评估其参数会导致后果,则不应使用此宏。在这种情况下,您需要像这样的幻想者:
#define OK_UNUSED(x) if(false && (x)) ; else (void) 0