2010-03-12 4 views
3

Поскольку я новичок в Visual C++, существует так много типов для обработки строки. Когда я использую какой-то тип и продолжаю кодирование, но на следующем шаге есть встроенные функции, которые используют другие типы &, всегда требуется преобразовать один тип строки в другой. Я нашел так много блогов, но так смущен, когда вижу так много ответов & попробуйте, но некоторые работают & некоторые нет.Рекомендации по обработке строки в VC++?

Пожалуйста, дайте свой ответ или ссылки, которые дают окончательное решение для обработки различных типов строк в visual C++.

ответ

5

Это зависит от того, что вы делаете. Его боль и отсутствие матери, что вы делаете, вам придется иметь дело с конверсией.

  • В большинстве случае класс станд :: строка сюита практически любой потребности и является Исли доступен для чтения, привыкшего к C++.

  • Если вы используете MFC CString будет наиболее часто видели и нормальный выбор

  • Для Cli системы C++ :: строка является стандартным

  • Все окна апи, которые принимают строки ожидать нулем cstyle string, но в зависимости от того, какую рабочую рамку вы используете, вам может не потребоваться много вызовов APi, особенно если вы используете .net

  • Я считаю, что в ATL есть еще пара классов строк, но я не использовал эту библиотеку много.

+2

Как разяснение, 'CString' теперь является« общим »классом между MFC и ATL (т. Е. Вы можете использовать' CString', не втягивая рамки MFC): http://msdn.microsoft.com/ en-us/library/zzs00fs6.aspx –

+0

Кроме того, при использовании Windows API вы, вероятно, захотите использовать 16-разрядные символы ширины, то есть std :: wstring вместо std :: string. –

2

Система API, Win32 работают на LPCWSTR (указатели на С-типа NULL прекращается массивы wchar_t). Системные заголовки предоставляют две версии каждого API, например SetWindowTextA (HWND, LPCSTR) и SetWindowTextW (HWND, LPCWSTR), и макрографическое отображение SetWindowText() для соответствующего в зависимости от определения UNICODE в вашем проекте, то есть:

#ifdef UNICODE 
#define SetWindowText SetWindowTextW 
#else 
#define SetWindowText SetWindowTextA 
#endif // !UNICODE 

SetWindowTextA (API) будет строить временный LPCWSTR от его параметров LPCSTR и вызвать SetWindowTextW(), где рабочий код, поэтому не используется Юникод и wchar_t в коде получает штраф производительности.

Интерфейсы COM предназначены для работы с BSTR, которые являются системой, распределенной между различными процессами.

К счастью, BSTR может быть построен из LPCWSTR с МС-го класса компилятор при условии _bstr_t: _bstr_t myBstr (/ LPCWSTR/psText).

Классы ATL :: CString и MFC CString (которые используют большую часть своего кода) используют один и тот же механизм макросов и сопоставляются с CStringA или CStringW.Оба имеют встроенный оператор (CStringA :: Оператор LPCSTR() CStringW :: Оператор LPCWSTR()), так что вы можете передать CString к API Win32:

CString myStr = _T("Hello"); 
::SetWindowText(myHwnd, myStr); 

станд :: [ш] строка не имеет никакой такой встроенный -в оператор, но член c_str(), который делает то же самое:

std::wstring myStr = L"Hello"; // assuming UNICODE defined 
::SetWindowText(myHwnd, myStr.c_str()); 

Резюме:

  1. определить UNICODE во всех проектах, чтобы избежать ухудшая производительность на платформе Win32.

  2. Если вы используете MFC, вы, естественно, будете использовать его класс CString, если вы используете ATL или none, вы можете использовать ATL :: CString, который является автономным классом (#include <atlstr.h>, не включает в себя библиотеку ATL) или std :: wstring.
  3. Если переносимость в другие системы необходима, вам необходимо использовать std :: wstring.
0

На мой взгляд, есть два пути. Используйте STL std :: string или std :: wstring. Или используйте MFC CString. Если я пишу код MFC, я всегда использую CString. Он позволяет использовать unicode по умолчанию, если ваша система настроена на его использование. Однако, как говорится, существует множество старых функций C/C++, которым не нравится базовый тип данных, используемый Unicode CStrings. У большинства из них всегда есть широкие версии, и нужно найти правильную версию для использования. CStrings также имеет массу встроенных функций; ИМО даже больше, чем строка std: :(​​w).

Существует также BSTR, если вы планируете выполнять какую-либо разработку COM, но мне редко приходилось использовать этот тип строки раньше.

Смежные вопросы