Windows-C++: LPCTSTR vs const TCHAR
In meiner Anwendung, die ich bin Deklaration einer string-variable, in der Nähe der Spitze von meinem code zu definieren, der name meiner window-Klasse, die ich verwende, meine Anrufe zu RegisterClassEx, CreateWindowEx usw... Nun, ich weiß, dass ein LPCTSTR ist ein typedef und schließlich Folgen nach unten auf einen TCHAR (auch ein CHAR oder WCHAR, je nachdem, ob UNICODE definiert ist), aber ich Frage mich, ob es besser wäre, dies zu nutzen:
static LPCTSTR szWindowClass = TEXT("MyApp");
Oder so:
static const TCHAR szWindowClass[] = TEXT("MyApp");
Ich persönlich bevorzuge die Verwendung des LPCTSTR, als käme Sie aus einem JavaScript, PHP, C# hintergrund ich habe nie wirklich in Betracht gezogen deklarieren Sie einen string als ein array von chars.
Aber gibt es eigentlich irgendwelche Vorteile bei der Verwendung einer über den anderen, oder hat es in der Tat nicht einmal einen Unterschied machen, welchen ich wählen?
Danke, in die erweiterte, für Eure Antworten.
- Sie haben nicht berücksichtigt die Verwendung der string-Klasse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den beiden Erklärungen sind nicht identisch. Das erste erstellt ein Zeiger, der zweite ein array von TCHAR. Der Unterschied ist vielleicht nicht offensichtlich sein, weil ein array zerlegen in einen Zeiger, wenn Sie versuchen, es zu benutzen, aber Sie merken es sofort, wenn Sie versuchen, legen Sie Sie in eine Struktur zum Beispiel.
Den Gegenwert Erklärung zu LPCTSTR ist:
Dem "L" LPCTSTR steht für "Long", die bisher nicht relevant, da 16-bit-Windows-Programmierung und können ignoriert werden.
sizeof
auf Ihnen werden Sie sehen, dass der Zeiger ist 4 oder 8 bytes, während das array ist 2*(n+1) für ein Unicode-string der Länge n ein.[]
) -- du wirst nie ein dangling pointer. Wenn Sie ein LPCSTR (Zeiger), müssen Sie es zuweisen, mitmalloc
oder weisen Sie einem vorhandenen Zeiger zu, sonst wird es ein dangling pointer. (Sie werden auch bemerken, dass insizeof()
)Da die Unicode-Zeichenfolgen sind native von Windows NT, es sei denn, Sie möchten, dass Ihre Anwendung ausführen, die auf ANSI-native Windows 9x, verwenden Sie immer die wide-character-Zeichenfolgen (
WCHAR
oderwchar_t
Arten).Relativ zu deiner Frage, beide Formen können scheinen gleich; aber obwohl beide werden voraussichtlich zugeteilt werden, die Konstante string-Abschnitt der ausführbaren Datei, string-Literale sind nicht unbedingt änderbar, wenn Sie als array-Initialisierungen.
e.g: (aus der C-Faq, 16.6) kann Der folgende code crash:
So ist es besser, immer zu verwenden:
Wieder von C-Faq:
Ein literaler string kann verwendet werden, in zwei leicht unterschiedliche Möglichkeiten.
Als ein array-Initialisierer (wie in der Deklaration von char a[]), es gibt den ersten Werte der Zeichen im array. Nirgendwo sonst verwandelt es sich in eine unbekannte, statische array von Zeichen, die gespeichert werden können in nur-lese-Speicher, das ist, warum Sie können nicht sicher ändern. In einem Ausdruck Kontext, wird das array konvertiert auf einmal auf einen Zeiger, wie üblich (siehe Abschnitt 6), so dass die zweite Deklaration initialisiert p auf die Unbenannte array das erste element.
http://linuxdude.com/Steve_Sumit/C-faq/q1.32.html
Die array-form ist vorzuziehen, für string-Literale dieses Typs. Die Daten-und code-beteiligten nimmt (sehr, sehr geringfügig) weniger Platz, und die variable kann nicht geändert werden, um den Punkt an eine andere Zeichenfolge. (In der Tat, es gibt keine variable überhaupt, nur ein name für die Adresse des ersten char im string -- es verhält sich sehr viel wie eine wörtliche Bedeutung in dieser Hinsicht.)