【发布时间】: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。