Frage

In meiner Anwendung deklariere ich eine String -Variable ganz oben in meinem Code, um den Namen meiner Fensterklasse zu definieren, die ich in meinen Aufrufen zum Registerclassex, createwindowex usw. verwende Folgen Sie zu einem TChar (na ja, ein Zeichen oder ein WCHAR, je nachdem, ob Unicode definiert ist), aber ich habe mich gefragt, ob es besser wäre, dies zu verwenden:

static LPCTSTR szWindowClass = TEXT("MyApp");

Oder dieses:

static const TCHAR szWindowClass[] = TEXT("MyApp");

Ich persönlich bevorzuge die Verwendung des LPCTSTRS als von einem JavaScript, PHP, C# -Hintergrund.

Aber gibt es tatsächlich Vorteile, einen gegenüber dem anderen zu verwenden, oder macht es tatsächlich nicht einmal einen Unterschied, welches ich wähle?

Vielen Dank in Fortgeschrittene für Ihre Antworten.

War es hilfreich?

Lösung

Die beiden Erklärungen sind nicht identisch. Der erste erstellt einen Zeiger, das zweite eine Reihe von TChar. Der Unterschied ist möglicherweise nicht erkennbar, da ein Array in einen Zeiger zersetzt wird, wenn Sie versuchen, ihn zu verwenden, aber Sie werden es sofort bemerken, wenn Sie versuchen, sie zum Beispiel in eine Struktur zu setzen.

Die äquivalente Deklaration zu LPCTSTR lautet:

static const TCHAR * szWindowClass = TEXT("MyApp");

Das "L" in LPCTSSTR steht für "Long", was seit 16-Bit-Windows-Programmierung nicht relevant ist und ignoriert werden kann.

Andere Tipps

Da Unicode-Zeichenfolgen von Windows NT nativ sind, es sei denn, Sie möchten, dass Ihre Anwendung auf ANSI-nativen Windows 9x ausgeführt wird, verwenden Sie immer Weitcharakter-Zeichenfolgen (Saiten (WeitcharakterWCHAR oder wchar_t Typen).

In Bezug auf Ihre Frage können beide Formen möglicherweise erscheinen gleich; Altough wird jedoch voraussichtlich im Abschnitt Konstante Zeichenfolge Ihrer ausführbaren Datei, String -Literale, zugewiesen sind nicht unbedingt veränderbar wenn als Array -Initialisierer verwendet.

ZB: (Aus C -FAQ, 16.6) Der folgende Code kann zum Absturz kommen:

char *p = "HELLO";
p[0] = 'H';

Es ist also immer besser zu verwenden:

char a[] = "HELLO";

Wieder aus C FAQ:Ein Saitenliteral kann auf zwei leicht unterschiedliche Arten verwendet werden. Als Array -Initialisierer (wie in der Deklaration von char a []) gibt es die Anfangswerte der Zeichen in diesem Array an. Überall sonst wird es zu einer unbenannten, statischen Reihe von Zeichen, die möglicherweise im schreibgeschützten Speicher gespeichert werden kann. Deshalb können Sie es nicht sicher ändern. In einem Ausdruckskontext wird das Array wie gewohnt sofort in einen Zeiger konvertiert (siehe Abschnitt 6), sodass die zweite Deklaration P initialisiert, um auf das erste Element des ungenannten Arrays zu verweisen.

http://linuxdude.com/steve_sumit/c-faq/q1.32.html

Das Array -Formular ist für String -Literale dieses Typs vorzuziehen. Die Daten und Code nimmt (sehr, sehr geringfügig) weniger Platz auf, und die Variable kann nicht so geändert werden, dass sie auf eine andere Zeichenfolge zeigten. (Tatsächlich gibt es überhaupt keine Variable, nur einen Namen für die Adresse des ersten Zeichens in der Zeichenfolge - sie verhält sich in dieser Hinsicht sehr ähnlich wie ein wörtlicher Wert.)

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