Подтвердить что ты не робот

Должен ли я использовать _T или _TEXT в строковых литералах С++?

Например:

// This will become either SomeMethodA or SomeMethodW,
// depending on whether _UNICODE is defined.
SomeMethod( _T( "My String Literal" ) );

// Becomes either AnotherMethodA or AnotherMethodW.
AnotherMethod( _TEXT( "My Text" ) );

Я видел и то, и другое. _T, похоже, для краткости и _TEXT для ясности. Это просто субъективное предпочтение программиста или оно более техническое, чем это? Например, если я использую один над другим, будет ли мой код не компилироваться в отношении конкретной системы или какой-либо старой версии файла заголовка?

4b9b3361

Ответ 1

Простой grep SDK показывает нам, что ответ состоит в том, что это не имеет значения - они одинаковы. Оба они превращаются в __T(x).

C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _T(" *.h 
crt\src\tchar.h:2439:#define _T(x)       __T(x) 
include\tchar.h:2390:#define _T(x)       __T(x)

C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _TEXT(" *.h 
crt\src\tchar.h:2440:#define _TEXT(x)    __T(x) 
include\tchar.h:2391:#define _TEXT(x)    __T(x)

И для полноты:

C:\...\Visual Studio 8\VC>findstr /spin /c:"#define __T(" *.h 
crt\src\tchar.h:210:#define __T(x)     L ## x 
crt\src\tchar.h:889:#define __T(x)      x 
include\tchar.h:210:#define __T(x)     L ## x 
include\tchar.h:858:#define __T(x)      x

Однако, технически, для С++ вы должны использовать TEXT() вместо _TEXT(), но он (в конце концов) расширяется до того же самого.

Ответ 2

Зафиксируйте Unicode и просто используйте L"My String Literal".

Ответ 3

Из Раймонд Чен:

ТЕКСТ против _TEXT против _T и UNICODE vs. _UNICODE

Простые версии без подчеркивание влияет на набор символов заголовочные файлы Windows рассматривают как по умолчанию. Поэтому, если вы определите UNICODE, то GetWindowText будет отображаться на GetWindowTextW вместо Например, GetWindowTextA. Аналогично, макрос TEXT будет отображаться на L "..." вместо "...".

Версии с подчеркиванием влияют на набор символов C runtime заголовочные файлы обрабатываются по умолчанию. Так что если вы определяете _UNICODE, тогда _tcslen будет перейдите к wcslen вместо strlen, для пример. Аналогично, макрос _TEXT будет отображаться в L "..." вместо "...".

Как насчет _T? Хорошо, я не знаю об этом. Возможно, это было просто сохраните кого-нибудь, набрав текст.

Краткая версия: _T() - ленивый человек _TEXT()

Примечание. Вы должны знать, какую кодовую страницу использует текстовый редактор исходного кода при написании:

_TEXT("Some string containing Çontaining");
TEXT("€xtended characters.");

Байты, которые видит компилятор, зависят от кодовой страницы вашего редактора.

Ответ 4

Здесь интересный, прочитанный из известного и уважаемого источника.

Аналогично, макрос _TEXT будет отображаться в L "..." вместо "...".

Как насчет _T? Ладно, я не знаю об этом. Может быть, это просто для того, чтобы кого-то кого-то печатать.

Ответ 5

Я никогда не видел, чтобы кто-то использовал _TEXT() вместо _T().

Ответ 6

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

Важно различать эти два, когда вы пишете код, поэтому вам не нужно возвращаться и выяснить, что это позже.

Поэтому я использую _UT() для непереводимых строк и ZZT() (или что-то еще, что легко выполнить поиск) для строк, которые необходимо будет перевести. Экземпляры _T() или _TEXT() в коде являются доказательством строковых литералов, которые еще не были правильно классифицированы.

_UT и ZZT оба определены как _TEXT

Ответ 7

Эти макросы сохраняются с тех пор, когда приложение действительно захотело скомпилировать как версию Unicode, так и версию ANSI.

Сегодня нет оснований делать это - все это рудиментарно. Microsoft застряла в поддержке любой возможной конфигурации навсегда, но вы этого не делаете. Если вы не компилируете ни ANSI, ни Unicode (и никто, честно говоря) просто переходите к L "text".

И да, в случае, если это пока не ясно: _T == _TEXT

Ответ 8

Не используйте ни один из них, а также не используйте L "...". Используйте UTF-8 для всех строк и конвертируйте их непосредственно перед тем, как перейти к API-интерфейсам Microsoft.