避免警告'未引用的正式参数'

问题描述 投票:50回答:7

我有这样的超类:

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

作为一种惯例,我们以前将警告视为错误。如何避免以上警告?

谢谢。

c++ compiler-warnings suppress-warnings
7个回答
89
投票

在C ++中,您不必提供不使用名称的参数,因此可以执行以下操作:

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

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


28
投票

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

注释参数名称的方法很容易被不熟悉代码的人(或六个月后的我)所遗漏。

但是,这是一个样式问题,就代码生成,性能或健壮性而言,这两种方法都不是“更好”的或更理想的选择。对我而言,决定性因素是通过标准化系统向他人传达我的意图。省略参数名称并添加注释将同样有效:

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”,并找到希望使用自变量但未使用自变量的任何实例。通过采用一致的样式并习惯使用它,以后您和他人都可以更轻松地使用它。


20
投票

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


9
投票

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


6
投票

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


4
投票

我将使用宏来禁止未引用的形式参数警告:


0
投票

仅添加带有注释的引用该怎么办:

© www.soinside.com 2019 - 2024. All rights reserved.