我在Visual Studio上使用\ W4警告级别,而我正在编写Windows程序。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
我的应用程序中没有使用所有这些参数,因此我在编译时收到警告。
我知道有两种方法可以解决这个问题:
HINSTANCE /*hInstance*/
... 使用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);
哪一个是正确的?哪一个更安全?使用宏时有问题吗?
答案 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编程中。