忽略:警告:未使用的参数会产生什么后果 我正在研究C++项目,我注意到我们有很多关于未使用参数的警告。

忽略:警告:未使用的参数会产生什么后果 我正在研究C++项目,我注意到我们有很多关于未使用参数的警告。,c++,warnings,C++,Warnings,如果忽略这些警告,会产生什么影响?无。除了[EDIT]:正如其他人指出的,您可以有一个未分配的输出参数 您应该清理它们,因为在很多情况下,我看到开发人员忽略了大量警告中“隐藏”的重要警告,他们太习惯于看到警告,从来没有注意过这些警告。我尝试在任何时候都没有警告,并将编译器警告设置为最大级别。如果有大量对您不重要的不重要警告,你可能忽略了一个重要的警告,你刚才写的代码隐藏在它们中间。 这意味着你写了一个函数,这个函数取一个参数但不使用这个参数。它是无害的,但在某些情况下,它可能表示有bug 通常,

如果忽略这些警告,会产生什么影响?

无。除了[EDIT]:正如其他人指出的,您可以有一个未分配的输出参数


您应该清理它们,因为在很多情况下,我看到开发人员忽略了大量警告中“隐藏”的重要警告,他们太习惯于看到警告,从来没有注意过这些警告。我尝试在任何时候都没有警告,并将编译器警告设置为最大级别。

如果有大量对您不重要的不重要警告,你可能忽略了一个重要的警告,你刚才写的代码隐藏在它们中间。

这意味着你写了一个函数,这个函数取一个参数但不使用这个参数。它是无害的,但在某些情况下,它可能表示有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))) {
    
    }