【发布时间】: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 这一点没有实际意义,因为这里的问题是您不知道的一条信息,但可重复性与最小化同样重要。你在这里得到的东西很少,但你真正想要的是一个很小的程序,如果不是因为一个讨厌的编译器错误,它可以运行。在大多数情况下,如果您可以将程序降到完成的程度,那么除了您有兴趣解决问题原因的一个问题外,什么都不会跳出来,因为它没有任何东西可以隐藏。做对了,你根本不需要问任何问题。
标签: c++ windows winapi unicode