c ++虚函数,参数在未使用时获取警告

时间:2014-02-12 14:57:53

标签: c++ warnings compiler-warnings suppress-warnings

virtual void myFunc(int& a, int& b) {}

我收到有关未使用变量的警告但我不想在基类中对它们做任何事情。 我希望派生类在需要时实现它们,如果它们不实现它们则不执行任何操作。除了在编译器上放置标志之外,我该怎么做才能停止警告?

6 个答案:

答案 0 :(得分:25)

根本不要给他们起个名字:

virtual void myFunc( int&, int& );

答案 1 :(得分:9)

由于您不想使用它们,您可以发出参数名称。

然而,不是完全删除它们,有时候将它们评论出来更有用:

virtual void myFunc(int& /* a */ , int& /* b */ ) 
{
}

通过查看注释掉的名称,您仍然可以看到参数的意图。如果将实现放在标题中,这将是唯一提及参数名称的地方,这一点特别有用。

答案 2 :(得分:7)

您有几种方法来沉默此警告

  • 从声明/定义中删除它们:

    virtual void myFunc(int& /* a */ , int& /* b */ ) {}
    

    这个解决方案可能会引发一些警告,如Doxygen ......

  • 使用技巧告诉参数未使用:

    template <typename T> void unusedArg(const T&) {} // Helper function.
    
    // In the class
    virtual void myFunc(int& a, int& b) { unusedArg(a); unusedArg(b); }
    

    或在C ++ 11中:

    template <typename ... Ts> void unusedArgs(const Ts...&) {} // Helper function.
    
    // In the class
    virtual void myFunc(int& a, int& b) { unusedArgs(a, b); } // C++11
    
  • 在C ++ 17中,您还可以使用属性[[maybe_unused]]

    // In the class
    virtual void myFunc([[maybe_unused]] int& a, [maybe_unused]] int& b) {}
    

答案 3 :(得分:4)

尝试将没有参数名称的函数定义为

virtual void myFunc(int& ,int&  ) 
{

}

还要考虑使基类抽象的可能性

virtual void myFunc(int& a,int& b ) = 0;

如果它只是简化界面。

答案 4 :(得分:0)

在某些编译器中,您只需将变量名称写为“no-op”语句。

virtual void myFunc(int& a, int& b) 
{
    a;    // unused variable
    b;
}

但是,为了支持其他编译器并使目标明确,您可以使用宏或函数unused_argument来明确它。

如果这对你的编译器不起作用,我认为做sizeof(a);会有效。

答案 5 :(得分:0)

在Qt(5.x及更高版本,甚至更早)中,您可以访问位于Q_UNUSED中的qglobal.h宏。该宏对其参数执行void的强制转换,结果没有存储在任何地方-因此,使用MinGW / GCC可以接受的方式使用该变量不会产生其他副作用。