Должен ли я использовать CString, basic_string ‹TCHAR› или что-то еще с ATL / WTL?

Я только немного изучил ATL за последние пару дней (после того, как понял, насколько мучителен чистый Win32), а также узнал о WTL и MFC, и из того, что я вижу, существует довольно много разных строковых классов, доступных для меня.

Я использовал что-то вроде этого:

#include <tchar.h>
#include <string>
namespace std { typedef basic_string<TCHAR> _tstring; }

а затем используйте _tstring везде в моем коде. Изучив немного ATL, я узнал, что в atltmp.h есть CString класс. Очевидно, есть еще один CString класс в WTL и еще один CString класс в MFC.

Я не знаю, буду ли я придерживаться ATL или перейду на WTL, MFC или что-то еще. Но прямо сейчас я преобразую свой код Win32 в ATL, и я не уверен, что изменить, а что оставить.

Должен ли я использовать в моих строках CString вместо _tstring? Есть ли в этом какие-то преимущества, учитывая оба размера исполняемого файла (исключая разделяемые библиотеки) и переносимость / совместимость?


person user541686    schedule 26.08.2011    source источник
comment
Единственное, что вы можете легально добавить в пространство имен std, - это специализацию шаблона. Кроме того, я не знаю о WTL, но классы CString в ATL и MFC одинаковы, они оба определения типа CSimpleStringT (я думаю)   -  person Praetorian    schedule 26.08.2011
comment
@Praetorian: Эх, я не против заниматься такой ненавязчивой незаконной деятельностью в личном проекте. :П   -  person user541686    schedule 26.08.2011
comment
Я поискал CString в Google, когда впервые узнал о нем. Как оказалось, NSFW.   -  person Dawson    schedule 26.08.2011
comment
@Toolbox: О, LOL, я никогда не пробовал этого (я всегда делал CString class). Спасибо за предупреждение. XD   -  person user541686    schedule 26.08.2011
comment
@Praetorian: CString в ATL и MFC действительно одно и то же, однако ATL считается каноническим владельцем (в конце концов, он находится в пространстве имен ATL ...). Насколько я помню, у WTL нет своего собственного - я думаю, он просто использует ATL.   -  person ildjarn    schedule 26.08.2011


Ответы (2)


Я бы предпочел придерживаться CString для ATL / MFC / WTL. Не похоже, что у вас есть много возможностей для переносимости, если вы все равно используете эти фреймворки; и вы знаете, что они говорят: When in Rome ...

Кроме того, у CString есть несколько тонкостей

  • Вы можете загружать строки ресурсов из исполняемых файлов, используя CString::LoadString
  • Получите прямой доступ к внутреннему строковому буферу с помощью CString::GetBuffer/ReleaseBuffer
  • Бесшумное преобразование между CStringA и CStringW
  • Выполните printf-подобное форматирование, используя CString::Format
person Praetorian    schedule 26.08.2011
comment
Вы также можете получить доступ к внутреннему буферу basic_string - просто сделайте &str[0]. Но особенно мне нравятся 3-й и 4-й баллы - думаю, я все-таки выпью кул-хид. +1 - person user541686; 26.08.2011
comment
О, вопрос: может ли использование CString хоть как-то заметно повлиять на размер исполняемого файла? Я не ожидаю, что это произойдет, но я не хочу добавлять 100 КиБ в исполняемый файл размером 80 КиБ только для изменения строковых классов. - person user541686; 26.08.2011
comment
Если вы используете статически связанный MFC, вы начинаете с 3000 КБ, так что это не имеет большого значения. : - › - person Bo Persson; 26.08.2011
comment
Кроме того, CStrings подсчитываются, что делает копирование дешевым. (msdn.microsoft.com/en- us / library /) Я еще не видел, чтобы std :: string, на которую ссылаются, подсчитывались (я не знаю, позволяет ли это стандарт). - person Andrew Stein; 26.08.2011
comment
@Andrew Stein C ++ 03 не запрещает реализации std::string с подсчетом ссылок; не знаю о C ++ 0x. Кроме того, я помню, что где-то читал, что libstdc ++ действительно реализует подсчет ссылок для std::string - person Praetorian; 27.08.2011
comment
@Andrew: Хорошо, тогда я обязательно буду использовать CString, подсчет ссылок - это то, чего я всегда хотел. :) Спасибо! - person user541686; 27.08.2011
comment
@Praetorian: Оказывается, моя версия ATL (2.1, из Windows 2003 DDK) не имеет никакого метода для удаления символов. Думаю, я буду придерживаться basic_string тогда ... - person user541686; 27.08.2011
comment
@Mehrdad Значит, все функции-члены Remove, Mid, Left, Right отсутствуют? - person Praetorian; 27.08.2011
comment
@Praetorian: Ой, да ладно. Я больше искал такие вещи, как Substring, Remove и т.д ... они определенно существуют, но я их полностью пропустил. Спасибо! - person user541686; 27.08.2011
comment
@ Prætorian молча преобразовать? Я всегда думал, что нужно использовать макросы CT2W и т. Д. - person Mike Caron; 03.02.2012

Я только что прочитал, что CString не поддерживает нулевые символы.

Думаю, тогда я буду придерживаться STL.

person user541686    schedule 08.09.2011