Domanda

Ad esempio:

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

Ho visto entrambe le cose. _T sembra essere per brevità e _TEXT per chiarezza. E 'puramente una preferenza programmatore soggettivo o è più tecnico di quello? Per esempio, se uso uno sopra l'altro, sarà il mio codice non compilare nei confronti di un particolare sistema o qualche versione precedente di un file di intestazione?

È stato utile?

Soluzione

Una semplice grep del SDK ci mostra che la risposta è che non importa: sono lo stesso . Entrambi si trasformano in __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)

E per completezza:

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

Tuttavia, tecnicamente , per C ++ si dovrebbe utilizzare TEXT() invece di _TEXT(), ma (eventualmente) si espande per la stessa cosa anche.

Altri suggerimenti

Si impegnano a Unicode e basta usare L"My String Literal".

Raymond Chen :

  

TESTO vs. _TEXT vs _T, e Unicode vs. _UNICODE

     

Le versioni di pianura senza la   sottolineatura influenzare il set di caratteri   i file di intestazione di Windows trattano come   predefinito. Quindi, se si definisce UNICODE,   poi GetWindowText mapperà a   GetWindowTextW invece di   GetWindowTextA, per esempio.   Allo stesso modo, il testo macro verrà convertito   L "..." al posto di "...".

     

Le versioni con il carattere di sottolineatura   influenzare il set di caratteri il runtime C   file di intestazione trattano come predefinito. Quindi se   definiresti _UNICODE, allora sarà _tcslen   mappa per wcslen invece di strlen, per   esempio. Analogamente, la macro _TEXT   mapperà a L "..." al posto di "...".

     

Che dire _T? Va bene, non so   su quello. Forse era solo per   salvo qualcuno un po 'di battitura.

Versione corta: _T() è _TEXT() di un uomo pigro

Nota: È necessario essere consapevoli di ciò che il codice-pagina sorgente editor di testo il codice usa quando si scrive:

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

I byte il compilatore vede dipende dalla tabella codici del vostro editor.

Ecco 's una lettura interessante da un noto e fonte rispettata.

  

Allo stesso modo, la macro _TEXT mapperà a L "..." al posto di "...".

     

Che dire _T? Va bene, io non so che uno. Forse era solo per salvare qualcuno un po 'di battitura.

Non ho mai visto nessuno usare _TEXT() invece di _T().

Nessuno dei due. Nella mia esperienza ci sono due tipi fondamentali di stringhe letterali, quelli che sono invarianti, e quelli che devono essere tradotte quando il codice è localizzato.

E 'importante distinguere tra i due come si scrive il codice in modo non c'è bisogno di tornare indietro e capire che è che più tardi.

Quindi io uso _UT() per archi intraducibili, e ZZT() (o qualcos'altro che è facile per cercare) per le stringhe che dovranno essere tradotti. Le istanze di _T() o _TEXT() nel codice sono la prova di stringhe letterali che non hanno ancora essere categorizzati in modo corretto.

_UT e ZZT sono entrambi #defined a _TEXT

Queste macro sono una presa nel corso dei tempi in cui la domanda potrebbe essere in realtà voluto per compilare sia un unicode e la versione ANSI.

Non v'è alcun motivo per fare questo oggi - questo è tutto residuale. Microsoft è bloccato con il supporto di ogni possibile configurazione per sempre, ma non lo sono. Se non state compilando sia ANSI e Unicode (e nessuno è, siamo onesti) basta andare con L "testo".

E sì, nel caso in cui non era chiaro, ormai: _T == _TEXT

Con nessuno dei due, e anche si prega di non utilizzare la L "..." merda. Utilizzare UTF-8 per tutte le stringhe, e convertirli poco prima di passare alle API di Microsoft.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top