避免警告'未参考的正式参数'

时间:2010-06-11 06:19:19

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

我有一个像这样的超级课程:

class Parent
{
public:
    virtual void Function(int param);
};

void Parent::Function(int param)
{
    std::cout << param << std::endl;
}

..和这样的子类:

class Child : public Parent
{
public:
    void Function(int param);
};

void Child::Function(int param)
{
    ;//Do nothing
}

当我编译子类.cpp文件时,我收到此错误

warning C4100: 'param' : unreferenced formal parameter

作为一种做法,我们曾经将警告视为错误。如何避免上述警告?

感谢。

8 个答案:

答案 0 :(得分:82)

在C ++中,您不必提供不使用名称的参数,因此您可以这样做:

void Child::Function(int)
{
    //Do nothing
}

但是,您可能希望通过文档将参数名称保留在头文件中的声明中。空语句(;)也是不必要的。

答案 1 :(得分:28)

我更喜欢使用宏,因为它不仅告诉编译器我的意图,还告诉代码的其他维护者,以后可以搜索它。

不熟悉代码的人(或者我6个月后)很容易错过评论参数名称的方法。

然而,这是一个样式问题,在代码生成,性能或稳健性方面,这两种方法都不是“更好”或更优化。对我来说,决定性因素是通过标准化系统告知他人我的意图。省略参数名称并添加注释也同样有效:

void CFooBar::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
    UNREFERENCED_PARAMETER(pNMHDR);

可替换地:

void CFooBar::OnLvnItemchanged(NMHDR* /* pNMHDR */, LRESULT *pResult)
{
    // Not using: pNMHDR

我会说最糟糕的解决方案是抑制警告信息;这将影响你的整个文件或项目,你将失去可能你错过了一些东西的知识。至少通过添加宏,或者注释掉参数名称,你已经告诉别人你已经有意识地决定不使用这个论点并且这不是一个错误。

WinNT.h中的Windows SDK定义UNREFERENCED_PARAMETER()以及DBG_UNREFERENCED_PARAMETER()DBG_UNREFERENCED_LOCAL_VARIABLE()。它们都评估相同的东西,但区别在于,当您开始时使用DBG_UNREFERENCED_PARAMETER()并期望在代码更完整时使用该参数。如果您确定永远不会使用该参数,请使用UNREFERENCED_PARAMETER()版本。

Microsoft基础类(MFC)具有类似的约定,使用较短的UNUSED()UNUSED_ALWAYS()宏。

选择一种风格并坚持下去。这样,您可以在代码中搜索“DBG_UNREFERENCED_PARAMETER”并找到您希望使用参数的任何实例,但不会。通过采用一致的风格,并习惯性地使用它,您将在以后更容易为其他人和自己。

答案 2 :(得分:19)

如果要保留参数名称,可以使用的另一种技术是转换为void:

void Child::Function(int param)
{
    (void)param;   //Do nothing
}

答案 3 :(得分:8)

正如@Charles Bailey所提到的,你可以跳过参数名称。

但是,在某些情况下,您需要参数名称,因为在调试版本中,您在其上调用ASSERT(),但在零售版本中,它是nop。对于那些场景,有一个方便的宏(至少在VC ++中:-))UNREFERENCED_PARAMETER(),其定义如下:

#define UNREFERENCED_PARAMETER(x) x

请注意,@ Samuel Klatchko发布的简单演员也有效,但我个人觉得如果代码明确表示这是一个未引用的参数而不是简单的无法解释的演员,那么它更具可读性。

答案 4 :(得分:4)

我会使用宏来抑制未引用的形式参数警告:

#define UNUSED( x ) ( &reinterpret_cast< const int& >( x ) )

这具有以下优点:

  • 与#define UNUSED(x)(void)x不同,它不需要在以前不存在此类需求的情况下看到参数类型的完整定义。
  • 与#define UNUSED(x)&amp; x不同,它可以安全地使用其类型超载一元&amp;的参数。操作者。

答案 5 :(得分:4)

Pragma也很好用,因为很清楚你使用的是VS.鉴于未引用的参数在回调接口和派生方法中非常常见,此警告具有非常高的噪声与效益比。甚至微软Windows中使用W4的团队已经厌倦了它的无意义(更适合/ Wall)并且只是添加到他们的项目中:

#pragma warning(disable: 4100)

如果您想仅缓解一段代码的警告,请用:

将其括起来
#pragma warning(push)
#pragma warning(disable: 4100)
void SomeCallbackOrOverride(int x, float y) { }
#pragma warning(pop)

省略参数名称的做法在调试器中存在缺点,您无法通过名称轻松检查,也无法将其添加到手表中(如果您有多个未引用的参数,则会感到困惑),并且方法的特定实现可能不使用该参数,知道它的值可以帮助您确定您所处的进程的哪个阶段,尤其是当您没有上面的整个调用堆栈时。

答案 6 :(得分:0)

从 C++17 开始,您还可以使用 [[maybe_unused]] 来避免此类警告:

class Parent
{
public:
    virtual void Function([[maybe_unused]] int param);
};

答案 7 :(得分:-1)

仅添加带有注释的参考呢?

void Child::Function(int param)
{
    param; //silence unreferenced warning
}

在这里也建议这样做:https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-4-c4100?view=vs-2019