无法将“wchar_t”转换为“LPCSTR”[重复]

Posted

技术标签:

【中文标题】无法将“wchar_t”转换为“LPCSTR”[重复]【英文标题】:Cannot convert 'wchar_t' to 'LPCSTR' [duplicate] 【发布时间】:2019-11-15 22:16:28 【问题描述】:

我使用 Atom 作为我的编辑器,并且我有 g++ 编译器来编译我的 C++ 文件。

有问题的代码 sn-p 是:

bool openComPort(wchar_t* portSpecifier)

    DCB dcb;

    // Open Serial Port
    wprintf(L"Opening COM PORT: %s",portSpecifier);
    printf("\n");

    serialPort = CreateFile(portSpecifier,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

    if (serialPort == INVALID_HANDLE_VALUE)
    
        wprintf(L"Error opening Serial port: %s\n",portSpecifier);
        return(false);
    

    ...

    return true;


如果我想编译它,我总是会得到错误:

错误:无法将 'wchar_t' 转换为 'LPCSTR' aka 'const char' serialPort = CreateFile(portSpecifier,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

我读过它应该与 Windows 和 UNICODE 或 ASCII 有关。

我通过按 ctrl+shift+U 并选择 UTF-8 确保 Atom 使用 UNICODE。

一开始我尝试#define UNICODE。没用。

我尝试过与其他线程不同的解决方案,例如:

(_TCHAR*)wprintf(L"Opening COM PORT: %s",portSpecifier);

我仍然总是得到同样的错误。您对如何解决这个问题有什么建议吗?

【问题讨论】:

看起来您的构建已关闭 unicode。 CreateFileW 吃遍了 chars,但最好在你的工具中找到打开 unicode 的选项。 我认为_T 之类的东西是允许代码在遗留系统上编译的杂物。在这种情况下使用 WCHAR*W 函数变体,即 CreateFileW()。顺便说一句:这真的需要minimal reproducible example。那也会告诉你关于 opencv 的最初问题的答案,即它是无关紧要的。 @FelixKunz 您是否从错误消息中删除了一些*?没有它们就没有意义。 或者,在 g++ 命令行上指定预处理器符号(例如-DUNICODE -D_UNICODE)。 @FelixKunz 这一点没有实际意义,因为这里的问题是您不知道的一条信息,但可重复性与最小化同样重要。你在这里得到的东西很少,但你真正想要的是一个很小的程序,如果不是因为一个讨厌的编译器错误,它可以运行。在大多数情况下,如果您可以将程序降到完成的程度,那么除了您有兴趣解决问题原因的一个问题外,什么都不会跳出来,因为它没有任何东西可以隐藏。做对了,你根本不需要问任何问题。 【参考方案1】:

尝试将 CreateFile 更改为 CreateFileW。

Microsoft 有两个涉及字符串的旧 Win32 调用版本,一种用于多字节字符集,另一种用于它所谓的 Unicode,即 UTF-16 / UCS-2,基本上每个字符 Unicode 两个字节。如果 API 调用是 CreateFoo,则调用的两个版本将是 CreateFooA 和 CreateFooW,然后在 Windows 标头中某处 CreateFoo 将被定义为一个宏,该宏扩展为 CreateFooA 或 CreateFooW,具体取决于是否定义了 UNICODE 预处理器定义。

如果您在 Visual Studio 中工作,则该预处理器定义的声明由 GUI 中的项目设置控制。既然你不是,如果你正在使用宽字符,请尝试直接调用 CreateFile 的 Unicode 版本。

【讨论】:

"两个版本的所有" -- 较新的 API 往往只有一个 wchar_t 接口,没有 W 后缀。

以上是关于无法将“wchar_t”转换为“LPCSTR”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

wchar_t到QString的转换方法?

C++求助[Error]cannot convert 'const wchar_t*' to 'LPCSTR aka const char*

CString 如何转为wchar_t

怎样把Cstring转换成wchar

使用 TCHAR 时出错,无法转换为 wchar_t

将 vector<char> buf(256) 转换为 LPCSTR?