避免警告“未引用的forms参数”
我有这样一个超类:
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 }
不过,您可能希望通过文档的方式将参数名保留在头文件的声明中。 空的语句( ;
)也是不必要的。
我更喜欢使用macros,因为它不仅告诉编译器我的意图,而且还告诉代码的其他维护者,稍后可以search它。
不熟悉代码的人(6个月以后)可能会很容易地忽略注释参数名的方法。
然而,这是一个风格问题,无论哪种方法在代码生成,性能或健壮性方面都“更好”或更优化。 对我来说,决定性的因素是通过一个标准化的系统来通知他人我的意图。 省略参数名称并发表评论也同样适用:
void CFooBar::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult) { UNREFERENCED_PARAMETER(pNMHDR);
或者:
void CFooBar::OnLvnItemchanged(NMHDR* /* pNMHDR */, LRESULT *pResult) { // Not using: pNMHDR
我会说最糟糕的解决办法是压制警告信息; 这会影响你的整个文件或项目,你会失去知识,也许你错过了什么。 至less通过添加macros或者说出参数名称,你告诉别人你已经有意识地决定不使用这个参数,这不是一个错误。
WinNT.h中的Windows SDK定义了UNREFERENCED_PARAMETER()
以及DBG_UNREFERENCED_PARAMETER()
和DBG_UNREFERENCED_LOCAL_VARIABLE()
。 他们都评估相同的事情,但不同的是,当你开始时使用DBG_UNREFERENCED_PARAMETER(),并希望在代码更完整时使用参数。 如果您确定永远不会使用该参数,请使用UNREFERENCED_PARAMETER()版本。
Microsoft基础类(MFC)具有类似的约定,使用较短的UNUSED()
和UNUSED_ALWAYS()
macros。
select一种风格,坚持下去。 这样以后,您可以在代码中search“ DBG_UNREFERENCED_PARAMETER
”,并查找您希望使用参数的地方的任何实例,但是没有。 通过采用一致的风格,并习惯性地使用它,以后会让其他人更容易。
如果要保留参数名称,则可以使用另一种技术,即将其转换为void:
void Child::Function(int param) { (void)param; //Do nothing }
正如@Charles Bailey所提到的,你可以跳过参数名称。
但是,在某些情况下,您需要参数名称,因为在debugging版本中,您正在对其调用ASSERT()
,但在零售版本上它是一个nop
。 对于那些场景,有一个方便的macros(至less在VC ++ :-)) UNREFERENCED_PARAMETER()
,它是这样定义的:
#define UNREFERENCED_PARAMETER(x) x
请注意简单的@R Samuel Klatchko发布也可以,但是我个人觉得它更易读,如果代码明确表示这是一个未引用的参数,而不是像这样简单的无法解释的转换。
我会使用macros来压制未引用的forms参数警告:
#define UNUSED( x ) ( &reinterpret_cast< const int& >( x ) )
这具有以下优点:
- 与#define UNUSED(x)(void)x不同,它没有引入参数types完整定义的需要,在没有这种需求之前就可以看到。
- 与#define UNUSED(x)&x不同,它可以安全地使用其types超载一元&运算符的参数。
Pragma也很好用,因为你很清楚你正在使用VS. 这个警告具有非常高的噪声和收益比,因为未callback的参数在callback接口和派生方法中非常常见。 即使使用W4的Microsoft Windows团队已经厌倦了它的无意义(将更适合于/ Wall),并简单地添加到他们的项目中:
#pragma warning(disable: 4100)
如果你想减轻只是一段代码的警告,围绕它:
#pragma warning(push) #pragma warning(disable: 4100) void SomeCallbackOrOverride(int x, float y) { } #pragma warning(pop)
忽略参数名称的做法在debugging器中有缺点,您不能通过名称轻松检查,也不会将其添加到监视器(如果您有多个未引用的参数,则会变得困惑),而方法的特定实现可能不会使用该参数,因为知道它的值可以帮助您找出您所处的进程中的哪个阶段,特别是当您没有整个调用堆栈时。