繁体   English   中英

c ++字符串类型混乱

[英]c++ string types confusion

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

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

不过,当我写的时候

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

编译器提示以下错误:

C2664:'size_t strlen(const char *)':无法将参数1从'LPCTSTR'转换为'const char *'指向的类型不相关; 转换需要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会提示已经定义的警告。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM