Будет ли std :: basic_string <TCHAR>предпочтительнее std :: wstring в Windows? - PullRequest
10 голосов
/ 05 июня 2009

Насколько я понимаю, Windows # определяет 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 и забыть об этом?

Ответы [ 3 ]

17 голосов
/ 05 июня 2009

Я считаю, что время, когда было целесообразно выпускать не-юникодные версии вашего приложения (для поддержки Win95 или для сохранения КБ или двух), давно прошло: в настоящее время базовая система Windows, которую вы будете поддерживать, будет основанный на юникоде (поэтому использование системных интерфейсов на основе символов на самом деле усложнит код, вставив слой подкладки из библиотеки), и вряд ли вы вообще сэкономите место. Иди std::wstring, молодой человек! -)

9 голосов
/ 05 июня 2009

Я сделал это на очень больших проектах, и он прекрасно работает:

namespace std
{
#ifdef _UNICODE
    typedef wstring tstring;
#else
    typedef string tstring;
#endif
}

Вместо этого вы можете использовать wstring везде, если хотите, если вам не нужно когда-либо компилировать, используя многобайтовую строку символов. Я не думаю, что вам когда-либо потребуется поддерживать многобайтовые строки символов в любом современном приложении.

Примечание. Предполагается, что пространство имен std запрещено, но у меня не было никаких проблем с вышеуказанным методом в течение нескольких лет.

3 голосов
/ 06 июня 2009

Об одном нужно помнить. Если вы решите использовать std :: wstring в своей программе полностью, вам все равно может понадобиться использовать std :: string, если вы общаетесь с другими системами с использованием UTF8.

...