我在.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
会提示已经定义的警告。
答案 0 :(得分:4)
答案 1 :(得分:2)
_tcslen
正在扩展为strlen
。 LPCTSTR
正在扩展到const wchar_t*
。这意味着您_UNICODE
和UNICODE
定义不一致。前者由TCHAR
头文件使用,后者由Windows头文件使用。鉴于您的更新问题,我说您已定义UNICODE
并且未定义_UNICODE
。
除此之外,你不应该使用TCHAR
让生活更轻松。当您需要能够为Win9x和WinNT编译单个源代码时,这非常有用。现在你可能不是针对Win9x。所以我的建议是简单地删除TCHAR
的所有使用并使代码更简单。