我正在开发一个C ++项目,我注意到我们对未使用的参数有很多警告。
如果忽略这些警告会有什么影响?
答案 0 :(得分:56)
在以下情况下,带有未使用参数的函数可能存在真正的错误:
有一个输出参数,该参数未被分配或写入,导致调用者的值不确定。
其中一个参数是一个回调函数指针,您必须调用它并忘记这样做。如果函数中有很多#ifdef
,可能会发生。
您声明一个具有相同名称的局部变量,该变量会影响参数,然后在函数中使用错误的值。
不使用输入参数可能无害,但您可以通过强制转换在函数开头明确标记未使用的输入参数来降低噪音以查看有用的警告它到void
(适用于C和C ++):
(void)param1;
或者,
#define UNUSED(expr) do { (void)(expr); } while (0)
...
void foo(int param1, int param2)
{
UNUSED(param2);
bar(param1);
}
或省略参数名称(仅限C ++):
void foo(int param1, int /*param2*/)
{
bar(param1);
}
答案 1 :(得分:14)
如果你有很多对你来说不重要的不重要的警告,你可能会忽略关于你刚写的隐藏在它们中间的代码行的重要警告。
答案 2 :(得分:14)
对于禁用警告的gcc特定方式,您可以使用__attribute__((unused))
之类的
void foo(int a, int b __attribute__((unused))) {
}
忽略第二个参数。如果您的程序已经依赖于GCC技术,那么您可以使用该属性从这种警告中100%安全。
答案 3 :(得分:1)
无。除了[编辑]:正如其他人指出的那样,你可以有一个未分配的输出参数。
你应该清理它们,因为在很多场合我看到开发人员忽略了大量警告中“隐藏”的重要警告,他们习惯于看到他们从未关注过他们的警告。我尝试始终保持零警告,并将编译器警告设置为最大级别。
答案 4 :(得分:1)
这意味着您编写了一个接受参数但不使用该参数的函数。它是无害的,但在某些情况下可能表明存在缺陷。
通常,您可以通过删除参数名称来静音此警告,将其保留为匿名,但这可能不合适,具体取决于未使用该参数的原因。
我建议你关闭警告,如果它更难找到真正的问题。
答案 5 :(得分:1)
这取决于您是否打算使用参数。 E.g。
const int Size = 12; // intended for use in some other function
char* MakeBuffer(int size)
{
return new char[Size];
}
在此代码中,'size'未使用,而是使用常量'Size'。因此,警告将突出显示此类问题。
但是,如果您从未缩进使用该参数,那么应该只从方法签名中删除它。除非你需要匹配虚拟方法或函数指针的签名,否则你就没有选择删除它。
答案 6 :(得分:1)
在C ++中,您可以使用默认参数:
int sum(int first, int second=0){ // should not give warning
return first+first;
}
您还可以有额外的参数:
int sum(int first, int second){ // should give warning
first *= 2;
return first;
}
如果你有一个参数,你没有使用和它没有默认,你应该得到一个警告,因为你要求程序将额外的值传递给从未引用的堆栈,并且因此,它正在做更多的工作。
也许这意味着你也忘记了部分功能逻辑。
答案 7 :(得分:0)
如果方法不使用参数,那么出现的第一个问题是为什么该参数首先是方法签名的一部分。这些警告确实有意义,因为它们指的是糟糕的设计,而且还有一点开销,无论何时调用此方法,此参数都被压入堆栈,因此,最好是重构方法并删除这些参数没有任何用处。
话虽如此,除了我提到的一点开销外,留下这些参数不会造成很大的伤害。