const char*类型的参数与类型为“的参数不兼容;LPCWSTR";

const char*类型的参数与类型为“的参数不兼容;LPCWSTR";,c,C,我试图在VisualStudio2012中用C语言制作一个简单的消息框,但是我得到了 以下错误消息 argument of type const char* is incompatible with parameter of type "LPCWSTR" err LNK2019:unresolved external symbol_main referenced in function_tmainCRTStartup 这是源代码 #include<Windows.h> int

我试图在VisualStudio2012中用C语言制作一个简单的消息框,但是我得到了 以下错误消息

argument of type const char* is incompatible with parameter of type "LPCWSTR"

err LNK2019:unresolved external symbol_main referenced in function_tmainCRTStartup
这是源代码

#include<Windows.h>

int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
{

    MessageBox(0,"Hello","Title",0);

    return(0);
}
#包括
int_stdcall WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevinstance、LPSTR lpszCmdline、int nCmdShow)
{
消息框(0,“你好”,“标题”,0);
返回(0);
}
请帮忙


感谢并祝愿

要使您的代码以两种模式编译,请将字符串括在_T()中,并使用TCHAR等价物

#include <tchar.h>
#include <windows.h>

int WINAPI _tWinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, LPTSTR lpszCmdLine, int nCmdShow)
{
    MessageBox(0,_T("Hello"),_T("Title"),0);
    return 0;
}
#包括
#包括
int WINAPI_tWinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevinstance、LPTSTR lpszCmdLine、int nCmdShow)
{
消息框(0,_T(“你好”),_T(“标题”),0);
返回0;
}

我最近偶然发现了这个问题,做了一些研究,并认为我会将我在这里发现的一些东西记录下来

首先,在调用
MessageBox(…)
时,实际上只是调用了一个宏(出于向后兼容的原因),该宏正在调用
MessageBoxA(…)
进行ANSI编码,或者调用
MessageBoxW(…)
进行Unicode编码

因此,如果要在Visual Studio中使用默认编译器设置传入ANSI字符串,可以调用
MessageBoxA(…)

#include<Windows.h>

int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
{

    MessageBoxA(0,"Hello","Title",0);

    return(0);
}
\u T()
宏正在使字符串“字符集中性”。通过在生成()之前定义符号
\u Unicode
,您可以使用此命令将所有字符串设置为Unicode


希望这些信息能帮助你和其他人遇到这个问题。

< P>在VisualC++中编译你的代码需要使用多字节CHAR WiAPI函数而不是宽字符的函数。 设置项目->属性->常规->字符集选项以使用多字节字符集


我在这里找到了它

是的,不管它是什么,它是一个错误的教程,你需要把它变成一个长字节整数

试试这个:

#include<Windows.h>
int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
{
    MessageBox(0,L"Hello",L"Title",0);
    return(0);
}
#包括
int_stdcall WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevinstance、LPSTR lpszCmdline、int nCmdShow)
{
消息框(0,L“你好”,L“标题”,0);
返回(0);
}

检查项目的字符集设置(项目属性、配置属性、常规、字符集)。它可能设置为“使用Unicode”而不是“使用多字节”。您正在Unicode操作系统上运行代码。您应该使用Unicode字符串。就像我说的“你好”。你可以把时钟调回1991年,但是如果你这样做的话,使用C就没有多大意义了。Windows API是。请注意,“多字节”字符串仍然可以对Unicode代码点进行编码,因此选择此选项并不一定是“将时间倒流到1991年”。可以使用多字节(而不是宽字符)字符串编写完全正确、全球化、支持Unicode的应用程序。不,winapi旨在支持旧项目,在上个世纪开始的。创建一个新的字符串,并通过强制兼容函数转换字符串来故意降低代码的速度,这是毫无意义的。最好使用脚本语言。@HansPassant否。world在UTF8上运行,使用它作为您的内部表示,以便与world兼容,或者如果您需要严肃的字符级文本处理,可以使用UCS4。上个千年的16位半纵火编码是一个有趣的好奇心,应该留在古代计算博物馆。Windows操作系统对这种编码的依赖是一个bug,而不是一个特性。速度的微小提高并不是在您自己的代码中承认此类错误的有效理由。通过您的建议,类型为const char*get removed的参数仍然显示在函数\u tmaincrtstartup中引用的未解决的外部符号\u main更正了winmain部分。如果你让VisualStudio为你创建虚拟程序,这就是它将给你的答案。非常有用的答案!在VisualStudio2019中,它现在映射到:项目->属性->高级->字符->使用多字节字符集查看microsoft的新指南
#include<Windows.h>
int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
{
    MessageBox(0,L"Hello",L"Title",0);
    return(0);
}