Question

Par exemple:

// 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" ) );

Je l'ai vu à la fois. _T semble être par souci de concision et _TEXT pour plus de clarté. Est-ce simplement une préférence de programmeur subjectif ou est-il plus technique que cela? Par exemple, si j'utilise un sur l'autre, sera mon code ne compilera pas contre un système ou une ancienne version d'un fichier d'en-tête?

Était-ce utile?

La solution

Un grep simple du SDK nous montre que la réponse est que ne-ils la matière ne sont pas les mêmes . Ils ont tous deux se transforment en __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)

Et pour être complet:

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

Cependant, techniquement , C ++, vous devriez utiliser TEXT() au lieu de _TEXT(), mais il (éventuellement) Développe la même chose aussi.

Autres conseils

Engagez-vous à Unicode et il suffit d'utiliser L"My String Literal".

De Raymond Chen :

  

TEXT vs vs _TEXT _T, et UNICODE vs. _UNICODE

     

Les versions simples sans   affecter le soulignement jeu de caractères   les fichiers d'en-tête de Windows traitent comme   défaut. Donc, si vous définissez UNICODE,   puis GetWindowText tracera à   GetWindowTextW au lieu de   GetWindowTextA, par exemple.   De même, la macro TEXT carte à   L "..." au lieu de "...".

     

Les versions avec le trait de soulignement   affecter le jeu de caractères du moteur d'exécution C   fichiers d'en-tête traitent par défaut. Donc si   définiriez-vous _UNICODE, puis _tcslen sera   carte à wcslen au lieu de strlen, pour   exemple. De même, la macro _TEXT   tracera L « ... » au lieu de « ... ».

     

Qu'en est-_T? D'accord, je ne sais pas   A propos de celui-là. Peut-être qu'il était juste   sauver quelqu'un de la frappe.

Version courte: _T() est le _TEXT() d'un homme paresseux

Note: Vous devez être conscient de ce que le code page de votre éditeur de texte de code source est utilisé lorsque vous écrivez:

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

Les octets pour le compilateur dépend de la page de code de votre éditeur.

est une lecture intéressante d'un source bien connue et respectée.

  

De même, la macro _TEXT tracera L "..." au lieu de "...".

     

Qu'en est-_T? D'accord, je ne sais pas celui-là. Peut-être qu'il était juste pour sauver quelqu'un de la frappe.

Je ne l'ai jamais vu quelqu'un utiliser _TEXT() au lieu de _T().

Ni. Dans mon expérience, il y a deux types de littéraux de chaîne, ceux qui sont invariantes, et ceux qui doivent être traduits lorsque votre code est localisé.

Il est important de faire la distinction entre les deux que vous écrivez le code de sorte que vous ne devez pas revenir et comprendre qui est qui plus tard.

J'utilise _UT() pour les chaînes intraduisibles, et ZZT() (ou autre chose qui est facile à rechercher sur) pour les chaînes qui devront traduire. Les cas de _T() ou _TEXT() dans le code sont la preuve de littéraux de chaîne qui n'ont pas encore être correctement catégorisés.

_UT et ZZT sont tous deux #defined à _TEXT

Ces macros sont une prise au-dessus de l'époque où une demande aurait voulu en fait de compiler à la fois une unicode et la version ANSI.

Il n'y a aucune raison de le faire aujourd'hui - tout cela est vestigial. Microsoft est coincé à l'appui toutes les configurations possibles pour toujours, mais vous n'êtes pas. Si vous n'êtes pas compilez à la fois ANSI et Unicode (et personne n'est, soyons honnête) juste aller avec L « texte ».

Et oui, au cas où il n'a pas été clair maintenant: _T == _TEXT

Utilisez non plus, et aussi s'il vous plaît ne pas utiliser le L « ... » merde. Utilisez UTF-8 pour toutes les chaînes et les convertir juste avant de passer aux API de Microsoft.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top