60

我有一个像这样的超级类:

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

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

谢谢。

4

8 回答 8

100

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

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

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

于 2010-06-11T06:20:51.623 回答
32

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

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

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

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

或者:

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

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

WinNT.h 中的 Windows SDKUNREFERENCED_PARAMETER()DBG_UNREFERENCED_PARAMETER()和一起定义DBG_UNREFERENCED_LOCAL_VARIABLE()。它们都评估相同的东西,但不同之处在于 DBG_UNREFERENCED_PARAMETER() 在您开始时使用,并希望在代码更完整时使用参数。如果您确定永远不会使用该参数,请使用 UNREFERENCED_PARAMETER() 版本。

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

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

于 2011-07-25T14:31:03.997 回答
20

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

void Child::Function(int param)
{
    (void)param;   //Do nothing
}
于 2010-06-11T06:33:49.300 回答
11

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

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

#define UNREFERENCED_PARAMETER(x) x

请注意,@R Samuel Klatchko 发布的简单演员表也有效,但我个人认为,如果代码明确表明这是一个未引用的参数,而不是像这样的简单未解释演员表,它更具可读性。

于 2010-06-11T06:36:19.090 回答
7

Pragma 也可以很好地工作,因为很明显您正在使用 VS。鉴于未引用的参数在回调接口和派生方法中非常常见,因此此警告具有非常高的噪声收益比。即使是 Microsoft Windows 中使用 W4 的团队也已经厌倦了它的无意义(更适合 /Wall)并简单地添加到他们的项目中:

#pragma warning(disable: 4100)

如果您只想减轻一段代码的警告,请将其包围:

#pragma warning(push)
#pragma warning(disable: 4100)
void SomeCallbackOrOverride(int x, float y) { }
#pragma warning(pop)

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

于 2014-10-28T05:19:58.680 回答
4

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

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

这具有以下优点:

  • 与#define UNUSED( x ) ( void )x 不同,它不会引入对参数类型的完整定义的需要,而以前可能不存在这样的需要。
  • 与 #define UNUSED( x ) &x 不同,它可以安全地与类型重载一元 & 运算符的参数一起使用。
于 2012-01-19T14:19:34.493 回答
4

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

class Parent
{
public:
    virtual void Function([[maybe_unused]] int param);
};
于 2021-08-06T09:07:43.380 回答
-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

于 2020-04-10T10:17:32.507 回答