я включать следующие файлы в моей .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
предлагает предупреждение, что оно уже определено.
В соответствии с [docs] (https://msdn.microsoft.com/en-us/library/c426s321.aspx) управляющий макрос является '_UNICODE', а не' UNICODE'. Правильно ли вы это определили? – Angew
Да, я попытался определить 'UNICODE' и/или' _UNICODE' в начале файла .cpp, но это не помогло – nicks
Вы когда-нибудь планировали использовать MBCS или SBCS? Если нет, вы можете просто избавиться от всего бизнеса tchar и явно использовать wchar_t. – Angew