我包括我的.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