【问题标题】:c++ string types confusionc++ 字符串类型混淆
【发布时间】:2015-03-13 08:13:55
【问题描述】:

我在我的 .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会提示已经定义的警告。

【问题讨论】:

  • 根据docs,控制宏是_UNICODE,而不是UNICODE。你的定义正确吗?
  • 是的,我尝试在 .cpp 文件的开头定义 UNICODE 和/或 _UNICODE 但没有帮助
  • 您是否打算使用 MBCS 或 SBCS?如果没有,您可以摆脱整个 tchar 业务并明确使用wchar_t

标签: c++ string winapi unicode


【解决方案1】:

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

【讨论】:

  • @NikaGamkrelidze 您的 VS 项目设置(在项目属性中)是否也包含 unicode?​​span>
  • @Nika 只需停止使用 tchar,所有问题都会消失
  • @NikaGamkrelidze 他们怎么可能?此宏的目的是让您选择您是否要使用 SBCS、MBCS 或 UTF-16。标题查看控制宏的状态并相应地定义 typedef 和函数宏。
  • 很简单。删除 TCHAR。明确类型。所以使用 wchar_t。定义UNICODE。故事结局。这是我的回答中的建议。
  • @NikaGamkrelidze 虽然该文档的主要目的略有不同,但您可能需要阅读UTF-8 everywhere,或至少阅读“如何在 Windows 上执行文本”部分。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多