c ++字符串类型混乱

时间:2015-03-13 08:13:56

标签: c++ string winapi unicode

我在.cpp程序中包含以下文件:

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

然而,当我写

LPCTSTR pMsg;
DWORD msgLen;
...
msgLen = _tcslen(pMsg);

编译器会提示以下错误:

  

C2664:&#39; size_t strlen(const char *)&#39; :无法转换参数1   &#39; LPCTSTR&#39;到#char; char *&#39;   指向的类型是无关的;转换需要reinterpret_cast,   C风格的演员表或功能风格的演员

当然,我可以通过转换为LPCSTR或使用wcslen来轻松解决问题。但那不对,编译器本身不应该决定所有这些东西,具体取决于宏UNICODE?它当然是定义的,因为当我在文件的开头写#define UNICODE时,编译器会提示警告,说它已经定义了。那有什么问题呢?为什么选择strlen代替wcslen

以下是实际代码:

BOOL PrintString(HANDLE hOut, ...)
{
    DWORD msgLen, count;
    LPCTSTR pMsg;
    va_list pMsgList;
    va_start(pMsgList, hOut);
    while((pMsg = va_arg(pMsgList, LPCTSTR)) != NULL)
    {
        msgLen = _tcslen(pMsg);
        if(!WriteConsole(hOut, pMsg, msgLen, &count, NULL) && !WriteFile(hOut, pMsg, msgLen*sizeof(TCHAR), &count, NULL))
        {
            va_end(pMsgList);
            return FALSE;
        }
    }
    va_end(pMsgList);
    return TRUE;
}

我同时尝试了#define _UNICODE#define _UNICODE,但两者都没有帮助。此外,#define _UNICODE会提示已经定义的警告。

2 个答案:

答案 0 :(得分:4)

根据MSDN,_tcslen展开的内容由宏_UNICODE控制。另一方面,LPCTSTRUNICODE控制。确保一致地定义了这两个宏,并且在包含可能使用它们的任何标头之前。

答案 1 :(得分:2)

_tcslen正在扩展为strlenLPCTSTR正在扩展到const wchar_t*。这意味着您_UNICODEUNICODE定义不一致。前者由TCHAR头文件使用,后者由Windows头文件使用。鉴于您的更新问题,我说您已定义UNICODE并且未定义_UNICODE

除此之外,你不应该使用TCHAR让生活更轻松。当您需要能够为Win9x和WinNT编译单个源代码时,这非常有用。现在你可能不是针对Win9x。所以我的建议是简单地删除TCHAR的所有使用并使代码更简单。