правильный стиль для взаимодействия с устаревшим кодом TCHAR

Я изменяю чужой код, который широко использует TCHAR. Лучше ли просто использовать std::wstring в моем коде? wstring должен быть эквивалентен TString на широкоформатных платформах, поэтому я не вижу проблемы. Обоснование заключается в том, что проще использовать необработанную строку wstring, чем поддерживать TCHAR... например, используя boost: wformat.

Какой стиль будет более понятен следующему сопровождающему? Я сам потратил несколько часов, пытаясь понять тонкости строк, кажется, простое использование wstring отрежет половину материала, который вам нужно понять.

typedef std::basic_string<TCHAR> TString; //on winxp, TCHAR resolves to wchar_t
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;

... единственная разница - это распределитель.

В том маловероятном случае, если ваша программа окажется на компьютере с Windows 9x, все еще существует уровень API, который может преобразовать ваши строки UTF-16 в 8-битные символы. Нет смысла использовать TCHAR для разработки нового кода. источник


person Dustin Getz    schedule 13.07.2010    source источник
comment
Что именно вас беспокоит? Компилятор C++ и компоновщик уведомят вас, если у вас есть какие-либо бинарные несовместимости. Если это касается исключительно стиля, поставьте себя на место следующего сопровождающего кода и выберите имена типов, которые будут наиболее понятны ей.   -  person David Gladfelter    schedule 14.07.2010


Ответы (2)


Если вы собираетесь ориентироваться только на платформы Unicode (wchar_t), вам лучше использовать std::wstring. Если вы хотите поддерживать многобайтовые сборки и сборки Unicode, вам нужно будет использовать TString и подобные.

Также обратите внимание, что basic_string по умолчанию устанавливает char_traits и аллокатор в единицу на основе переданного типа символа, поэтому в сборках, где UNICODE (или _UNICODE, я не могу вспомнить какой), TString и wstring будут одинаковыми.

ПРИМЕЧАНИЕ. Если вы просто передаете аргументы различным API и не выполняете с ними никаких манипуляций, вам лучше использовать const wchar_t * вместо std::wstring напрямую (особенно при смешивании Win32, COM и стандартного кода C++), так как вы в конечном итоге делать меньше конверсий и копий.

person reece    schedule 13.07.2010

Раньше TCHAR был более важным, когда вы собирались компилировать двоичные файлы дважды, один раз для char и второй для wchar_t.

Вы по-прежнему можете сделать этот выбор, если хотите, изменив настройки проекта MSVC с MBCS на Unicode и обратно.

Это также означает, что при вызове Windows API у вас будет соответствующий тип данных.

person Greg Domjan    schedule 13.07.2010