我包括我的.cpp程序下列文件:C++字符串类型混淆
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
然而,当我写
LPCTSTR pMsg;
DWORD msgLen;
...
msgLen = _tcslen(pMsg);
编译器会提示以下错误:
C2664: 'size_t strlen(const char *)' : cannot convert argument 1 from 'LPCTSTR' to 'const char *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
当然,我可以通过铸造到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
会提示已被定义的警告。
根据[文档](https://msdn.microsoft.com/en-us/library/c426s321.aspx),控制宏是'_UNICODE',而不是'UNICODE'。你有这个定义正确吗? – Angew 2015-03-13 08:23:26
是的,我试着在.cpp文件的开头定义'UNICODE'和/或'_UNICODE',但它没有帮助 – nicks 2015-03-13 08:25:10
你有没有计划使用MBCS或SBCS?如果没有,你可以摆脱整个tchar业务并明确使用'wchar_t'。 – Angew 2015-03-13 08:30:09