Visual Studio 2010 Arduino cpp错误:类型"char*"的参数与"LPCWSTR"类型的参数不兼容

X__*_*X__ 4 c++ arduino tchar visual-studio lpcwstr

我正在尝试使用Visual Studio 2010中的C++程序建立一个用于串口通信的arduino uno.我正在使用此处找到的代码:http://playground.arduino.cc/Interfacing/CPPWindows

不幸的是,.cpp文件为变量'portName'的第9行提供了以下消息:

错误:类型"char*"的参数与"LPCWSTR"类型的参数不兼容

我不明白这个错误信息,并尝试了一些不同的东西来解决它.任何帮助将不胜感激!

Mr.*_*C64 10

鉴于您的问题中的代码链接,似乎问题在于:

Serial::Serial(char *portName)
{
    ...

    this->hSerial = CreateFile(portName,  // <--- ERROR
Run Code Online (Sandbox Code Playgroud)

CreateFile是一个Win32 API,它需要LPCTSTR第一个字符串参数.

LPCTSTR 是一个Win32 typedef,它扩展为:

  • const char* 在ANSI/MBCS构建中
  • const wchar_t* 在Unicode版本中(自VS2005以来一直是默认版本)

由于您使用的是VS2010,因此您可能处于默认的Unicode构建模式.

实际上,没有CreateFile暴露"物理" API,但有两个不同的功能:CreateFileACreateFileW.前者采用const char*输入字符串,后者采用a const wchar_t*.

在Unicode构建中,CreateFile是一个扩展到的预处理器宏CreateFileW; 在ANSI/MBCS构建中,CreateFile扩展为CreateFileA.

因此,如果您处于Unicode构建模式,则CreateFile调用将扩展为CreateFileW(const wchar_t*, ...).由于portName定义为a char*,因此在wchar_t*和之间存在不匹配char*,并且您会收到编译器错误.

要解决这个问题,你有一些选择.

例如,您可以在代码中明确表示,而只是调用CreateFileA()而不是CreateFile().这样,您将使用该函数的ANSI/MBCS版本(即,采用a的版本const char*),独立于Visual Studio中的实际ANSI/MBCS/Unicode设置.


另一种选择是将当前的构建设置从默认的Unicode模式更改为ANSI/MBCS.为此,您可以按照以下路径:

Project Properties | Configuration Properties | General | Character Set
Run Code Online (Sandbox Code Playgroud)

并选择"使用多字节字符集",如以下屏幕截图所示:

在VS2010 IDE中设置多字节字符集