Лучшие практики для обработки строк в VC ++? - PullRequest
3 голосов
/ 12 марта 2010

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

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

Ответы [ 4 ]

5 голосов
/ 12 марта 2010

Это зависит от того, что вы делаете. Это боль и не важно, что вы делаете, вам придется иметь дело с обращением.

  • В большинстве случаев класс std :: string подойдет практически для любых задач и легко читается любым, кто привык к c ++.

  • Если вы используете MFC, cstring будет наиболее часто встречающимся и нормальным выбором

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

  • Все API-интерфейсы Windows, которые принимают строки, ожидают строки стиля, заканчивающейся нулем, однако в зависимости от того, какую работу фрейма вы используете, вам, возможно, не придется напрямую вызывать многие APi, особенно если вы используете .net

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

2 голосов
/ 12 марта 2010

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

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

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

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

К счастью, BSTR можно построить из LPCWSTR с помощью предоставленного компилятором MS _bstr_t class: _bstr_t myBstr (/ LPCWSTR / psText).

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

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

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

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

Резюме:

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

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

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

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

0 голосов
/ 12 марта 2010

Кроме того, прочитайте http://www.codeproject.com/KB/string/cppstringguide2.aspx и остальную часть этой серии, чтобы узнать об обработке строк в C ++. Да, это ужасно, это (IMO) один из худших недостатков C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...