Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误C2731:&x27;wWinMain';:函数不能重载_C++_Visual Studio_Winapi_Compiler Errors - Fatal编程技术网

C++ 错误C2731:&x27;wWinMain';:函数不能重载

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,

我将一个旧项目从VC6升级到VS2008,现在出现以下编译错误:

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编译时没有错误,那么这就回答了这个问题。我也有同样的问题,但在我没有更改配置的情况下出现了,这不是问题所在。