11

我在 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);
    

哪一个是正确的?哪一种使用起来更安全?使用宏有什么问题吗?

4

3 回答 3

12

我更喜欢评论参数。

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

如果稍后您确实引用它,您可能会忽略删除宏。

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

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

现在即使 USE_VALUE 未定义,也不会出现警告。

于 2016-06-16T10:34:22.263 回答
3

我认为删除名称的版本是第一个使用的版本。混淆信息系统可能有一个缺点,因此工具提示会显示残缺的版本。但是健康的人会使用名称所在的声明。(对于静态和一次性的东西,你不应该有未使用的参数,对吧?)

否则真的是口味问题。

于 2013-06-19T13:33:06.523 回答
2

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

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

在 C 中,不能删除参数名称;因此宏是Windows平台上的合理解决方案,尤其是在Win32编程中。

于 2020-01-04T22:12:50.590 回答