我有这样的超类:
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 ++中,您不必提供不使用名称的参数,因此可以执行以下操作:
void Child::Function(int)
{
//Do nothing
}
不过,您可能希望通过文档将参数名称保留在头文件的声明中。也无需使用空语句(;
)。
我更喜欢使用宏,因为它不仅告诉编译器我的意图,而且还告诉代码的其他维护者,以后可以搜索。
注释参数名称的方法很容易被不熟悉代码的人(或六个月后的我)所遗漏。
但是,这是一个样式问题,就代码生成,性能或健壮性而言,这两种方法都不是“更好”的或更理想的选择。对我而言,决定性因素是通过标准化系统向他人传达我的意图。省略参数名称并添加注释将同样有效:
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
”,并找到希望使用自变量但未使用自变量的任何实例。通过采用一致的样式并习惯使用它,以后您和他人都可以更轻松地使用它。
如果要保留参数名称,可以使用的另一种方法是强制转换为void:
正如@Charles Bailey提到的,您可以跳过参数名称。
Pragma的效果也很好,因为很明显您正在使用VS。鉴于未引用的参数在回调接口和派生方法中非常常见,因此此警告具有很高的噪声受益比。甚至使用W4的Microsoft Windows中的团队也已经厌倦了它的毫无意义(将更适合/ Wall),并简单地添加到他们的项目中:
我将使用宏来禁止未引用的形式参数警告:
仅添加带有注释的引用该怎么办: