_T( ) makro ändert für UNICODE-Zeichendaten
Habe ich UNICODE-Anwendung, wo in wir verwenden _T(x), die wie folgt definiert ist.
#if defined(_UNICODE)
#define _T(x) L ##x
#else
#define _T(x) x
#endif
Ich verstehe, dass L wird definiert, wchar_t, die 4 bytes auf jeder Plattform. Bitte korrigieren Sie mich, wenn ich falsch bin. Meine Forderung ist, die ich brauche L zu 2 bytes. Also als compiler-hack begann ich mit -fshort-wchar-gcc-flag. Aber jetzt muss ich meine Anwendung verschoben werden, um zSeries, wo ich nicht bekommen, um zu sehen, die Wirkung der -fshort-wchar-fahne in der, Plattform.
In Ordnung für mich, um der Lage sein, mein port-Anwendung auf zSeries, ich brauche zu ändern, _T( ) Makros in einer Weise, dass auch nach der Verwendung von L ##x und ohne mit -fshort-wchar-Flagge, die ich brauche, um 2byte wide-character-Daten.Kann jemand mir sagen, wie ich das ändern kann die definition von L, so dass ich definieren kann, L 2 bytes immer in meiner Anwendung.
wchar_t
ist in der Regel als Basis-Typ für WCHAR
, die sicherlich eine Breite von 2 Byte. Funktionen wie MessageBoxW
haben WCHAR*
Argumente, so dass WCHAR
und wchar_t
identisch mit der Windows-Programmierung sehr viel einfacher.L ist nur die Zeichen 'L'. Es wird nicht definiert, etwas zu sein. In C++, L"Hallo Welt" nur definiert ein wide string literal. Aber das L nicht zu bekommen, durch nichts zu ersetzen.
InformationsquelleAutor Nagasai Sowmya | 2010-11-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht - nicht ohne c++0x unterstützen. c++0x definiert die folgenden Arten der Deklaration von string-Literale:
Bis c++0x ist weit verbreitet, die einzige Weise zu Kodieren eine utf-16-string in eine cross-Plattform-Weg, ist die Auflösung in bits:
Das _T-makro kann nur liefern die Ware auf Plattformen, wo wchar_t sind 16 bit breit. Und die alternative ist immer noch nicht wirklich cross-Plattform: Die Kodierung für char und wchar_t ist die Umsetzung so definiert werden, dass " a "nicht unbedingt Kodierung der unicode-codepoint für" a " (0x61). Also, genau genommen, ist dies der einzige Weg, der der string geschrieben wird:
Ist einfach nur schrecklich.
a
ist immer noch gleich0x61
, aberj
ist nicht0x6a
.InformationsquelleAutor Chris Becke
Ah! Die Wunder der Beweglichkeit 🙂
Wenn Sie einen C99-compiler für alle Plattformen verwenden
int_least16_t
,uint_least16_t
... von<stdint.h>
. Die meisten Plattformen auch definierenint16_t
aber es ist nicht erforderlich, um zu existieren (wenn die Plattform ist in der Lage mit genau 16 bits zu einem Zeitpunkt, der typedefint16_t
definiert werden müssen).Nun wickeln Sie alle strings in arrays von
uint_least16_t
und stellen Sie sicher, dass Ihr code nicht erwarten, dass Werte vonuint_least16_t
zu Zeilenumbruch bei 65535 ...const uint_least16_t[]
Literale.Ich benutze den GCC-compiler. Es ist eine andere GCC-compiler-flag-andere als -fshort-wchar-ändern Sie die Größe von wchar_t.
uint_least16_t Daten[] = { 'f', 'o', 'o', 'b', 'a', 'r', '\0' };
hast du vor Ort die "ich muss mich ändern
_T( )
makro" - Teil der Frage? Wie funktioniert_T("foobar")
zu erweitern, umconst uint_least16_t data[] = { 'f', 'o', 'o', 'b', 'a', 'r', '\0' };
?Wollen Sie zwei unvereinbare Dinge: mindestens eines der Dinge, die bewegen --- der computer ist viel hartnäckiger als Sie
InformationsquelleAutor pmg