[英]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
会提示已经定义的警告。
_tcslen
正在扩展到strlen
。 LPCTSTR
正在扩展到const wchar_t*
。 这意味着您的_UNICODE
和UNICODE
定义不一致。 前者由TCHAR
头文件使用,后者由Windows头文件使用。 鉴于您更新的问题,我会说您已定义UNICODE
并且未定义_UNICODE
。
除此之外,你应该通过不使用TCHAR
让你的生活更轻松。 当您需要能够为Win9x和WinNT编译单个源代码时,这非常有用。 现在你可能不是针对Win9x。 所以我的建议是简单地删除所有使用TCHAR
并使代码更简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.