使用UNREFERENCED_PARAMETER宏

时间:2013-06-19 13:15:26

标签: c++ visual-studio parameters macros compiler-warnings

我在Visual Studio上使用\ W4警告级别,而我正在编写Windows程序。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

我的应用程序中没有使用所有这些参数,因此我在编译时收到警告。

我知道有两种方法可以解决这个问题:

  1. 评论参数HINSTANCE /*hInstance*/ ...
  2. 使用UNREFERENCED_PARAMETER

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
      UNREFERENCED_PARAMETER(hInstance);
      UNREFERENCED_PARAMETER(hPrevInstance);
      UNREFERENCED_PARAMETER(lpCmdLine);
      UNREFERENCED_PARAMETER(nCmdShow);
    
  3. 哪一个是正确的?哪一个更安全?使用宏时有问题吗?

3 个答案:

答案 0 :(得分:6)

我更愿意评论这些参数。

宏UNREFERENCED_PARAMETER在winnt.h中定义,因此不可移植。

如果以后你引用它,你可能会忽略删除宏。

编辑:使用C ++ 17,您现在可以使用[[maybe_unused]]属性。这对于取决于预处理器宏的代码很有用:

void foo( [[maybe_unused]] int value )
{
#ifdef USE_VALUE
   useValue(value);
#endif
}

即使未定义USE_VALUE,也不会有警告。

答案 1 :(得分:3)

我认为首先要使用名称删除版本。它可能会使信息系统混淆,因此工具提示会显示残缺的版本。但健康的人会使用声明,其中有名字。 (对于静态和一次性使用的东西,你不应该使用未使用的参数,对吗?)

否则真的是味道问题。

答案 2 :(得分:1)

在C ++中,这两种都是正确的处理方式,并且不会直接引入任何不安全性。但是,使用UNREFERENCED_PARAMETER可能会导致维护问题,因为如果将来的更新中使用了该参数,则需要删除对宏的使用,但是编译器不会发出警告。为了审核对宏的正确使用,开发人员必须手动检查参数是否仍未使用。

正如其他人指出的那样,跨平台可移植性也可能是一个问题。

在C语言中,无法删除参数名称。因此,该宏是Windows平台上的合理解决方案,尤其是在Win32编程中。