C++ 使用cppcheck的棘手情况
我面临的情况是我需要通过CPP考试,但有时会变得棘手。在这种情况下你通常做什么? 比如说C++ 使用cppcheck的棘手情况,c++,cppcheck,C++,Cppcheck,我面临的情况是我需要通过CPP考试,但有时会变得棘手。在这种情况下你通常做什么? 比如说 #include<iostream> using namespace std; void fun1(); int fun2(); int main() { fun1(); } void fun1() { int retVal; if (-1 == (retVal = fun2())) { cout
#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-抑制=冗余分配
-启用class='warning,style,performance,portability'-inlinesuppr-language='c++'retval\u neverused.cpp检查retval\u neverused.cpp。。。[retval\u neverused.cpp:13]:样式变量'retval'被分配了一个
从未使用过的值
我不想仅仅为了检查而添加一些虚线打印retVal。事实上,在这种情况下,我会抛出一个异常,我不希望该异常中包含诸如retVal值之类的琐碎内容。CppCheck是正确的。你根本不需要回复。直接检查fun2的返回值:if-1==fun2 另一方面,在条件表达式中指定变量是非常糟糕的做法。如果您打算键入==但实际上键入=,则很难发现输入错误。您可以重写为:
const int retval = fun2();
if (retval == -1)
IMHO,这种技术更容易调试,因为在执行if语句之前,通过调试器可以看到fun2返回的值
如果要查看函数的返回值,在if表达式中调试函数调用会稍微复杂一些。一种常见的方法是使用如下内容:
#define OK_UNUSED(x) (void)x
void fun1()
{
int retVal;
if (-1 == (retVal = fun2()))
{
OK_UNUSED (retVal);
cout <<"Failure. fun2 returned a -1"<< endl;
}
}
我没有得到Q值。在赋值之后,您不会使用retVal,因此诊断是正确的。现在您可以将代码重写为void fun1{if-1==fun2{cout
#define OK_UNUSED(x) if(false && (x)) ; else (void) 0