【问题标题】:argument of type const char* is incompatible with parameter of type "LPCWSTR"const char* 类型的参数与“LPCWSTR”类型的参数不兼容
【发布时间】:2014-02-17 16:53:11
【问题描述】:

我正在尝试在 Visual Studio 2012 中用 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);
}

请帮忙

感谢和问候

【问题讨论】:

  • 检查项目的字符集设置(项目属性、配置属性、常规、字符集)。它可能设置为“使用 Unicode”而不是“使用多字节”。
  • 您在 Unicode 操作系统上运行您的代码。您应该使用 Unicode 字符串。比如L“你好”。您可以将时钟拨回到 1991 年,但如果这样做,使用 C 语言就没有多大意义了。
  • @HansPassant 或切换到多字节。 Windows API 是designed to allow you use either/or。请注意,“多字节”字符串仍然可以编码 Unicode 代码点,因此选择此选项不一定是“将时钟拨回 1991 年”。可以使用多字节(而不是宽字符)字符串编写完全正确、全球化、支持 Unicode 的应用程序。
  • 不,winapi 旨在支持旧项目,即上个世纪开始的项目。创建一个新的并有意通过强制兼容性函数转换字符串来使代码变慢是没有意义的。还不如使用脚本语言。
  • @HansPassant 不。世界运行在 UTF8 上,使用它作为您的内部表示以便与世界轻松兼容,或者如果您需要严格的字符级文本处理,也可以使用 UCS4。上千年的半轴 16 位编码是一个有趣的好奇心,应该留在古代计算博物馆。 Windows 操作系统对这种编码的内部依赖是一个错误,而不是一个特性。微不足道的速度提升并不是承认您自己的代码存在此类错误的正当理由。

标签: c


【解决方案1】:

要使您的代码在两种模式下都编译,请将字符串括在 _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;
}

【讨论】:

  • 通过你的建议,const char* 类型的参数被删除
  • 但它仍然显示在 function_tmainCRTStartup 中引用的 unresolve externalsymbol_main
  • 更正了 winmain 部分。如果您让 Visual Studio 为您创建虚拟程序,那么它将为您提供。
【解决方案2】:

要在 Visual C++ 中编译代码,您需要使用 Multi-Byte char WinAPI 函数而不是 Wide char 函数。

设置项目 -> 属性 -> 常规 -> 字符集选项以使用多字节字符集

我在这里找到它https://stackoverflow.com/a/33001454/5646315

【讨论】:

  • 非常有用的答案!
  • 在 Visual Studio 2019 中,现在映射到:项目 -> 属性 -> 高级 -> 字符 -> 使用多字节字符集
【解决方案3】:

我最近遇到了这个问题并做了一些研究,并认为我会记录我在这里发现的一些内容。

首先,当调用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);
}

MessageBox(...) 的完整文档位于此处:https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

要扩展@cup 在他们的回答中所说的内容,您可以使用_T() 宏并继续使用MessageBox()

#include<tchar.h>
#include<Windows.h>

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

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

    return(0);
}

_T() 宏使字符串“字符集中立”。您可以通过在构建 (documentation) 之前定义符号 _UNICODE 来使用它来将所有字符串设置为 Unicode。

希望这些信息对您和遇到此问题的其他人有所帮助。

【讨论】:

    【解决方案4】:

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

    试试这个:

    #include<Windows.h>
    int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
    {
        MessageBox(0,L"Hello",L"Title",0);
        return(0);
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2016-05-19
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多