Будет ли std:: basic_string <TCHAR> предпочтительнее std:: wstring в Windows?
Как я понимаю, Windows #defines TCHAR как правильный тип символа для вашего приложения на основе сборки - так что это wchar_t
в сборках UNICODE и char
в противном случае.
Из-за этого я подумал, будет ли std::basic_string<TCHAR>
предпочтительнее std::wstring
, так как первый теоретически будет соответствовать типу символа приложения, тогда как второй всегда будет широким.
Итак, мой вопрос по существу: был бы std::basic_string<TCHAR>
предпочтительнее std::wstring
в Windows? И есть ли какие-либо оговорки (например, неожиданное поведение или побочные эффекты) при использовании std::basic_string<TCHAR>
? Или, должен ли я просто использовать std::wstring
в Windows и забыть об этом?
Ответы
Ответ 1
Я считаю, что время, когда было целесообразно выпускать не-юникодные версии вашего приложения (для поддержки Win95 или для сохранения КБ или двух), давно прошло: в настоящее время базовая система Windows, которую вы будете поддерживать, будет на основе unicode (поэтому использование системных интерфейсов на основе char фактически усложнит код, помещая слой прокладки из библиотеки), и вряд ли вы сохраните любое пространство вообще. Иди std::wstring
, молодой человек! -)
Ответ 2
Я сделал это на очень больших проектах, и он отлично работает:
namespace std
{
#ifdef _UNICODE
typedef wstring tstring;
#else
typedef string tstring;
#endif
}
Вы можете использовать wstring везде, но если хотите, если вам не нужно компилироваться с использованием многобайтовой символьной строки. Я не думаю, что вам нужно поддерживать многобайтовые символьные строки, хотя в любом современном приложении.
Примечание. Пространство имен std
должно быть отключено, но у меня не было проблем с указанным выше методом в течение нескольких лет.
Ответ 3
Одна вещь, о которой нужно помнить. Если вы решите полностью использовать std:: wstring в своей программе, вам все равно придется использовать std::string, если вы общаетесь с другими системами, использующими UTF8.