Dovrei usare _T o _TEXT su C ++ stringhe?
-
20-09-2019 - |
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?
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"
.
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.