忽略:警告:未使用的参数会产生什么后果 我正在研究C++项目,我注意到我们有很多关于未使用参数的警告。
如果忽略这些警告,会产生什么影响?无。除了[EDIT]:正如其他人指出的,您可以有一个未分配的输出参数忽略:警告:未使用的参数会产生什么后果 我正在研究C++项目,我注意到我们有很多关于未使用参数的警告。,c++,warnings,C++,Warnings,如果忽略这些警告,会产生什么影响?无。除了[EDIT]:正如其他人指出的,您可以有一个未分配的输出参数 您应该清理它们,因为在很多情况下,我看到开发人员忽略了大量警告中“隐藏”的重要警告,他们太习惯于看到警告,从来没有注意过这些警告。我尝试在任何时候都没有警告,并将编译器警告设置为最大级别。如果有大量对您不重要的不重要警告,你可能忽略了一个重要的警告,你刚才写的代码隐藏在它们中间。 这意味着你写了一个函数,这个函数取一个参数但不使用这个参数。它是无害的,但在某些情况下,它可能表示有bug 通常,
您应该清理它们,因为在很多情况下,我看到开发人员忽略了大量警告中“隐藏”的重要警告,他们太习惯于看到警告,从来没有注意过这些警告。我尝试在任何时候都没有警告,并将编译器警告设置为最大级别。如果有大量对您不重要的不重要警告,你可能忽略了一个重要的警告,你刚才写的代码隐藏在它们中间。 这意味着你写了一个函数,这个函数取一个参数但不使用这个参数。它是无害的,但在某些情况下,它可能表示有bug 通常,您可以通过删除参数名使其匿名来消除此警告,但这可能并不理想,具体取决于不使用参数的原因
如果警告使查找真正的问题变得更加困难,我建议您关闭警告。在以下情况下,带有未使用参数的函数可能存在真正的错误:
#ifdef
s,则可能会发生这种情况void
(适用于C和C++),从而降低噪音,以查看有用的警告:
或者
或省略参数名称(仅限C++):
如果一个方法不使用参数,那么出现的第一个问题是为什么该参数首先是该方法签名的一部分。这些警告是有意义的,因为它们所指的是糟糕的设计,而且,无论何时调用此方法,此参数都会被推送到堆栈上,因此,最好是重构该方法并删除这些没有任何用处的参数
话虽如此,除了我提到的一点开销外,保留这些参数不会造成太大伤害。这取决于您是否打算使用paramater。例如
const int Size = 12; // intended for use in some other function
char* MakeBuffer(int size)
{
return new char[Size];
}
在此代码中,未使用“size”,而是使用常量“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;
}
如果您有一个未使用且未默认的参数,您应该得到一个警告,因为您要求程序向堆栈传递从未被引用的额外值,因此所做的工作比它应该做的更多
可能这意味着您也忘记了部分函数逻辑。对于禁用警告的特定于gcc的方法,您可以使用
\uuuu属性(未使用))
如
void foo(int a, int b __attribute__((unused))) {
}
忽略第二个参数。如果您的程序已经依赖于GCC技术,那么您可以使用该属性100%安全地避免此类警告 你能解释一下一个未使用的参数如何“在某些情况下指示错误”吗?intfoo(inta,intb,intc){returnbar(a)+bar(a)+bar(c);}//oops,mcopy&paste bug,应该调用bar(b)。我相信,如果没有正式参数,值仍然会传递给函数。没有本地名称来访问该值。我对这个示例感到困惑——即使使用默认参数,为什么要在该示例中使用第二个参数?不管你是否通过了一些东西,它都不会被使用。我能想到的唯一一件事是,如果你现在不使用它,但你预计API将来会需要这些信息。这是一个不忽略警告的非常重要的原因。可能是最重要的原因。顺便说一句,Qt库中使用了使用UNUSED宏的方法:它有一个Q_UNUSED,其作用完全相同,但没有
do..while
wrapper。实际上,它看起来像一个常见的习惯用法。我在一些地方见过它。你能给我举个例子说明如何将它铸造成虚空吗?(我试过了,效果很好,但它看起来很奇怪,我从来没有想过它会编译——我相信其他人也会这么认为。)为什么你要在这里添加呢?当(void)expr
会做完全相同的事情。还是有区别?
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;
}
void foo(int a, int b __attribute__((unused))) {
}