2015-10-23 5 views
2

Я работаю над проектом win32 с помощью CStrings (консольное приложение), и я заметил что-то нечетное, когда я хочу перейти к функции (например, strtok_s) a LPSTR указатель от CString с методом GetBuffer(), этот последний вместо того, чтобы давать мне LPSTR, он дал мне LPWSTR (указатель на широкую строку) ... CString должен хранить 8-битные символы, не так ли?Является ли MFC CString широкой строкой char

В некоторых случаях я обязан использовать CStringA, чтобы, например, использовать метод Find(), потому что с входной строкой CString моя входная строка должна быть широкой. Но в другом другом проекте (оконная программа) у меня нет этой проблемы, я подозреваю заголовки (когда я использую afxstr.h «Найти» работает с нормальной строкой, но не с afxcoll.h ...)

Обычно я работаю с std::string, поэтому я потерян.

+3

IIRC, если ваш проект нацелен на Unicode 'CString' будет иметь внутренние буферы типа' LPWSTR' –

+0

Чтение в MSDN о CString https://msdn.microsoft.com/en-us/library/aa300688%28v=vs.60 % 29.aspx – demonplus

+2

@demonplus: этот документ предназначен для версии MFC, поставляемой с Visual Studio 6 (в 1998 году). Все изменилось, документ больше не верен, поскольку слияние ATL и MFC. – IInspectable

ответ

9

CString является typdef, объявлен как (afxstr.h):

typedef ATL::CStringT< TCHAR, StrTraitMFC<TCHAR> > CString; 
// Or, when using the MFC DLL 
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL<TCHAR> > CString; 

В зависимости от того, что TCHAR есть, CString хранит либо ANSI (MBCS) или строка Unicode. Также имеются явные экземпляры шаблона CStringT: CStringW и CStringA.

Любой тип имеет конструктор преобразования, принимающий постоянный указатель на соответствующую другую кодировку символов. Другими словами: вы можете построить CStringW из строки ANSI (MBCS), а также CStringA из строки Unicode, кодированной UTF-16LE.

Если вам нужно явно указать кодировку символов, используйте либо CStringW, либо CStringA.


Полная документация для CString доступна по номеру CStringT Class.