Frage

Zum Beispiel:

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

Ich habe beide gesehen. _T scheint der Kürze und _TEXT für Klarheit zu sein. Ist das nur ein subjektiver Programmierer bevorzugt oder ist es eher technische als das? Zum Beispiel, wenn ich einen über den anderen zu verwenden, wird mein Code nicht kompiliert gegen ein bestimmtes System oder eine ältere Version einer Header-Datei?

War es hilfreich?

Lösung

Ein einfaches grep der SDK zeigt uns, dass die Antwort, dass ist es nicht selbst sie sind die gleichen . Beide wiederum 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)

Und der Vollständigkeit halber:

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

Allerdings technisch , für C ++ Sie mit TEXT() statt _TEXT() werden sollen, aber es (schließlich) erweitert, um die gleiche Sache zu.

Andere Tipps

Commit zu Unicode und nur Verwendung L"My String Literal".

Raymond Chen :

  

TEXT vs. _TEXT vs. _T und UNICODE vs. _UNICODE

     

Die einfachen Versionen ohne die   unterstreichen den Zeichensatz beeinflussen   die Windows-Header-Dateien zu behandeln, als   Standard. Wenn Sie also UNICODE definieren,   dann wird GetWindowText Karte zu   GetWindowTextW statt   GetWindowTextA, zum Beispiel.   In ähnlicher Weise wird Karte der TEXT-Makro   L "..." statt "...".

     

Die Versionen mit einem Unter   Auswirkungen auf den Charakter der C-Laufzeit gesetzt   Header-Dateien behandeln als Standard. Also, wenn   Sie _UNICODE definieren, dann _tcslen Wille   Karte statt strlen Wcslen, für   Beispiel. Auch die _TEXT Makro   L „...“ statt wird Karte „...“.

     

Was ist _T? Okay, ich weiß nicht,   etwa, dass ein. Vielleicht war es nur zu   speichern jemand etwas Tipp.

Kurzversion: _T() ist ein fauler Mensch _TEXT()

Hinweis: Sie müssen sich bewusst sein, was Code-Seite des Quellcodes Texteditor, wenn Sie schreiben:

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

Die Bytes der Compiler sieht auf der Codepage Editor abhängig ist.

Hier ist eine interessante Lektüre von a bekannte und Quelle respektiert werden.

  

Auch die _TEXT Makro L abbildet "..." statt "...".

     

Was ist _T? Okay, ich weiß ja nicht, dass man. Vielleicht war es nur bis zu einem gewissen Eingabe speichert jemand.

Ich habe noch nie jemand Gebrauch _TEXT() statt _T() gesehen.

Weder noch. Nach meiner Erfahrung gibt es zwei grundlegende Arten von Stringliterale, um diejenigen, die unveränderlich sind, und diejenigen, die Notwendigkeit übersetzt werden, wenn Ihr Code lokalisiert ist.

Es ist wichtig, zwischen den beiden zu unterscheiden, wie Sie den Code schreiben, so dass Sie nicht zurück kommen müssen und herauszufinden, welche später, die.

Also ich Verwendung _UT() für unübersetzbar Strings und ZZT() (oder etwas anderes, das einfach suchen auf) für Strings, die übersetzt werden müssen. Instanzen von _T() oder _TEXT() im Code sind ein Beweis für Zeichenfolgenliterale, die noch nicht richtig kategorisiert werden.

_UT und ZZT sind beide #defined zu _TEXT

Diese Makros sind eine Halt über von den Tagen, wenn eine Anwendung könnte in der Tat sowohl eine Unicode und ANSI-Version kompilieren haben will.

Es gibt keinen Grund, dies heute zu tun - das alles verkümmert ist. Microsoft wird für immer mit Unterstützung jede mögliche Konfiguration stecken, aber sie sind es nicht. Wenn Sie nicht sowohl ANSI und Unicode kompilieren (und niemand ist, seien wir ehrlich) gehen Sie einfach auf mit L „Text“.

Und ja, falls es war nicht klar, von jetzt: _T == _TEXT

Verwenden Sie weder, und auch nicht, bitte die L verwenden „...“ Mist. Verwenden Sie UTF-8 für alle Strings und wandeln sie kurz vor dem Microsoft-APIs übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top