_TCHAR-Zuordnung

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Unicode für C++ - Index

Die _TCHAR-Zuordnung in Appmethod C++ dient der Vereinfachung des Schreibens von Quellcode, der mit "Wide"- oder "Narrow"-Strings verwendet werden kann. Sie können _TCHAR entweder wchar_t oder char zuordnen, so dass Ihr Code den korrekten für FireMonkey, die VCL oder die Windows-API erforderlichen String-Typ verwendet und RTL-Funktionen in die korrekte Definition (Wide bzw. Narrow) übergehen. Die Option _TCHAR entspricht wird im Dialogfeld Projekt > Optionen > C++ (Gemeinsame Optionen) gesetzt.

Ihre C++-Anwendung muss mit Wide- und Narrow-Strings arbeiten:

  • Die C++-RTL enthält Routinen für char und wchar_t.
  • Die Windows-API ist typischerweise "narrow" und erfordert daher char.
  • FireMonkey und die VCL verwenden (seit 2009) Wide-String-Daten (Unicode) und erfordert wchar_t.

In Interaktionen mit FireMonkey und der VCL müssen Sie jetzt die Wide-RTL-Funktionen verwenden oder vor der Übergabe von Daten an FireMonkey oder die VCL geeignete Konvertierungen durchführen. (Siehe UTF-8-Konvertierungsroutinen)

_TCHAR, das in der Header-Datei tchar.h konditional deklariert ist, ist als ein typedef (Alias) definiert, das entweder char oder wchar_t zugeordnet wird. Wenn Sie portierbaren Quelltext schreiben möchten (der mit der C++-RTL, der Windows-API, FireMonkey und der VCL interagieren kann), sollten Sie _TCHAR verwenden (anstatt die Datentypen char oder wchar_t hart zu codieren). Dann können Sie die _TCHAR-Zuordnungsoption entweder auf char oder auf wchar_t (auf der Seite C++ (Gemeinsame Optionen)) setzen. Beispielsweise steuert die aktuelle _TCHAR-Zuordnungseinstellung, ob Ihre Anwendung die ANSI-Versionen oder die Wide-Versionen der Floating-Funktionen in der RTL verwendet.

Option '_TCHAR entspricht'

Die Projektoption _TCHAR entspricht steuert die Floating-Definition von _TCHAR in Ihrem Code. _TCHAR kann entweder char oder wchar_t zugeordnet werden oder verwenden (siehe die folgende Tabelle):

Werte von '_TCHAR entspricht':

char
_TCHAR ersetzt char.

Hinweis: Diese Option verwendet nicht die Wide-Definitionen der Standardbibliothek und der API-Funktionen.

wchar_t
  • _TCHAR ersetzt wchar_t.
  • Diese Option setzt die UNICODE- und _UNICODE-Definitionen.
  • Sie verwendet die Wide-Definitionen der Standardbibliothek und der API-Funktionen.

So legen Sie die Option '_TCHAR entspricht' auf die Seite Verzeichnisse und Bediengungen fest:

Verwenden Sie das Dialogfeld Projekt > Optionen > Verzeichnisse und Bedingungen.

Verwendung von '_TCHAR entspricht' wchar_t für FireMonkey und die VCL

FireMonkey und die VCL sind in Unicode implementiert und erwarten immer Unicode. Standardmäßig wird _TCHAR wchar_t zugeordnet.

Beispielsweise kann der folgende Code erst compiliert werden, wenn Sie die Option '_TCHAR enspricht' auf wchar_t gesetzt haben:

TResourceStream* res =  new
    TResourceStream(HInstance, ResourceId, RT_RCDATA);

Wenn die Option '_TCHAR entspricht' auf char gesetzt ist, wird RT_RCDATA zu char* zugeordnet. FireMonkey und die VCL erwarten wchar_t* und deshalb ist das Setzen von char ein Problem, wenn Sie mit FireMonkey oder der VCL arbeiten möchten.

Erforderliche Codeänderungen für '_TCHAR entspricht' wchar_t

Wenn _TCHAR auf wchar_t (Standardeinstellung) gesetzt ist, muss Ihr Projekt einen Einsprungspunkt namens _tmain oder _tWinMain haben. Neue mit Appmethod C++ erstellte Projekte enthalten standardmäßig diese Einsprungspunkte, aber bei importierten Projekten müssen Sie sie eventuell manuell hinzufügen.

Sie müssen auch die Header-Datei tchar.h einbeziehen, die die Floating-Definitionen und die erforderlichen Einsprungspunkte enthält. Eine Liste der in tchar.h enthaltenen Floating-Funktionen, finden Sie unter Floating-Funktionen.

Hinweis: Wenn Sie anstelle von _tmain als Einsprungspunkt main verwenden, kann der Linker die ausführbare Datei nicht einbinden. Bei neuen Projekten, die FireMonkey oder die VCL verwenden, fügen die Experten automatisch einen _tmain-Einsprungspunkt ein.

Verwendung des Makros _TEXT vor Textliteralen

Mit den Makros _TEXT oder _T stellen Sie sicher, dass Zeichen- und String-Literale korrekt in ANSI oder Unicode verwendet werden. Zum Beispiel:

::MessageBox(0, _TEXT("The message"), _TEXT("The caption"), MB_OK);

Wenn _UNICODE definiert ist, übersetzt das Makro _TEXT (oder _T) einen literalen String (Zeichen) in die Form mit einem vorangestellten L; ansonsten übersetzt _TEXT das Literal ohne das Präfix L. Wenn Sie z.B. _UNICODE definieren, dann wird

_TEXT("The message")

in die Form mit vorangestelltem L übersetzt:

L"The message"

Ansonsten übersetzt dieses Makro in die Form ohne das Präfix L:

"The message"

Siehe auch