C++ 错误C2731:&x27;wWinMain';:函数不能重载
我将一个旧项目从VC6升级到VS2008,现在出现以下编译错误:C++ 错误C2731:&x27;wWinMain';:函数不能重载,c++,visual-studio,winapi,compiler-errors,C++,Visual Studio,Winapi,Compiler Errors,我将一个旧项目从VC6升级到VS2008,现在出现以下编译错误: error C2731: 'wWinMain' : function cannot be overloaded 在这些代码行中: int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
error C2731: 'wWinMain' : function cannot be overloaded
在这些代码行中:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
同一个项目在VC6下编译得很好。谢谢大家,我终于找到了真正的罪魁祸首,它是一个打字错误,我使用了
LPSTR lpCmdLine
而不是LPTSTR lpCmdLine
。真正的谜团是为什么它在VC6下编译——它确实使用了wWinMain
,但不知何故,lpCmdLine使用char*
而不是WCHAR*
,是可以的
现在我把它改成:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
它也在VS2008下工作
编辑:我成功地编译了程序,甚至在VC6下运行了此函数定义:
int APIENTRY wWinMain(int *hInstance, float hPrevInstance, int *lpCmdLine, float nCmdShow)
{
MessageBox(0,L"Running.",0,0);
return 0;
}
有趣的是,将
float-nCmdShow
替换为double-nCmdShow
确实会产生链接器错误,我认为这是因为float是32位,而double不是。我在Win32控制台应用程序中遇到了相同的错误。解决办法是:
对我来说,在VS 2019中将WinMain更改为wWinMain后,它工作正常。编译器的默认设置(unicode/非unicode)似乎有问题。您是否尝试在已转换的项目中切换此选项?我需要更改哪个设置?预处理器定义,链接器设置?我希望我的项目是Unicode的,而不是ASCII的方式。我已经在VC6下将其设置为Unicode。如果您将其更改为WinMain,它会工作吗?我想我以前从未见过tWinMain。据我所知,现在您正在从ANSY迁移到Unicode。我说得对吗?通常它不能自动完成。所以,最好现在就编译ANSY版本,以确保一切正常。而且只有在它之后,您才能迁移到ANSY+Unicode和Unicode版本(msdn.com上很少有关于它的文章)。@JonathanPotter是的,
WinMain
在VS2008上工作。不过,在VC6中,WinMain
和wWinMain
都可以工作。我在读,它谈到了它们之间的区别。在VC6中成功编译的保证被误导了。好发现!如果你能弄清楚它是如何在VC6中编译的,那也会很有帮助。谢天谢地,\uUnicode
可能没有在VC6中设置,所以LPTSTR
实际上是LPSTR
(而不是LPWSTR
)。我的猜测是VC6没有像它应该的那样区分指针。如果char*p;WCHAR*q;p=q代码>使用VC6编译时没有错误,那么这就回答了这个问题。我也有同样的问题,但在我没有更改配置的情况下出现了,这不是问题所在。