我正在处理一个 C++ 项目,我注意到我们有许多关于未使用参数的警告。
如果忽略这些警告会产生什么影响?
在以下情况下,带有未使用参数的函数可能会出现真正的错误:
有一个未分配或写入的输出参数,导致调用者的值未定义。
参数之一是回调函数指针,您必须调用它而忘记这样做。如果函数中有很多#ifdef
s,可能会发生。
您声明了一个具有相同名称的局部变量,它隐藏了一个参数,随后在函数中使用了错误的值。
不使用输入参数可能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);
}
如果您有很多对您来说不重要的不重要警告,您可能会忽略有关您刚刚编写的隐藏在它们中间的代码行的重要警告。
对于禁用警告的 gcc 特定方法,您可以使用__attribute__((unused))
like
void foo(int a, int b __attribute__((unused))) {
}
To ignore the second parameter. If your program relies on GCC technologies already, you can use that attribute to be 100% safe from that kind of warning.
没有任何。除了[编辑]:正如其他人指出的那样,您可能有一个未分配的输出参数。
您应该清理它们,因为在很多情况下,我看到开发人员忽略了“隐藏”在大量警告中的重要警告,而且他们已经习惯了看到警告,以至于他们从来没有注意到它们。我尝试始终保持零警告,并将编译器警告设置为最高级别。
这意味着您编写了一个带有参数但不使用参数的函数。它是无害的,但在某些情况下它可能表明存在错误。
通常,您可以通过删除参数名称并使其保持匿名来使此警告静音,但这可能不是可取的,具体取决于未使用参数的原因。
如果它使查找真正的问题变得更加困难,我建议您关闭警告。
这取决于您是否打算使用参数。例如
const int Size = 12; // intended for use in some other function
char* MakeBuffer(int size)
{
return new char[Size];
}
在此代码中,未使用“大小”,而是使用了常量“大小”。因此,警告将为您突出显示此类问题。
但是,如果您从未缩进使用该参数,则应该将其从方法签名中删除。除非您需要匹配虚拟方法或函数指针的签名,否则如果是这种情况,则您无法选择删除它。
在 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;
}
如果你有一个你没有使用的参数并且它不是默认的,你应该得到一个警告,因为你要求程序将额外的值传递给从不引用的堆栈,因此做的工作比它应该做的要多。
也许这意味着您也忘记了部分功能逻辑。
如果方法不使用参数,那么出现的第一个问题是,为什么该参数首先是方法签名的一部分。这些警告确实有意义,因为它们所指的是糟糕的设计,而且还有一点开销,每当调用此方法时,此参数都会被压入堆栈,因此,最好是重构方法并删除这样的参数没有任何用处。
话虽如此,除了我提到的一点开销之外,保留这些参数并没有太大的危害。