Domanda

Nella mia applicazione sto dichiarando una variabile stringa vicino alla parte superiore del mio codice per definire il nome della mia classe finestra che uso nelle mie chiamate a RegisterClassEx, CreateWindowEx ecc .. Ora, io so che un LPCTSTR è un typedef e alla fine seguirà fino a un TCHAR (ben un CHAR o WCHAR a seconda se UNICODE è definito), ma mi chiedevo se sarebbe meglio usare questo:

static LPCTSTR szWindowClass = TEXT("MyApp");

O questo:

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

Io personalmente preferisco l'uso del LPCTSTR come provenienti da un JavaScript, PHP, C # sfondo non ho mai pensato di dichiarare una stringa come un array di caratteri.

Ma ci sono in realtà eventuali vantaggi di utilizzare uno sopra l'altro, o lo fa in realtà nemmeno fare la differenza da quale scelgo?

Grazie, in anticipo, per le vostre risposte.

È stato utile?

Soluzione

Le due dichiarazioni non sono identici. Il primo crea un puntatore, secondo una matrice di TCHAR. La differenza potrebbe non essere evidente, perché una matrice si decompongono in un puntatore se si tenta di usarlo, ma noterete istantaneamente se si tenta di metterli in una struttura per esempio.

La dichiarazione equivalente a LPCTSTR è:

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

La "L" in LPCTSTR l'acronimo di "Long", che non è stato rilevante, in quanto la programmazione di Windows a 16 bit e può essere ignorato.

Altri suggerimenti

Dal momento che le stringhe Unicode sono nativo da Windows NT, a meno che non si desidera che l'applicazione per funzionare su ANSI-nativo di Windows 9x, sempre utilizzare stringhe di caratteri estesi (WCHAR o wchar_t tipi).

relativa alla tua domanda, entrambe le forme possono sembrare uguali; ma benche entrambi dovrebbero essere allocata nella sezione costante stringa dell'eseguibile, stringhe non sono necessariamente modificabili quando viene utilizzato come initializers matrice.

es: (da C Faq, 16.6) Il seguente codice può mandare in crash:

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

Quindi è meglio sempre per l'uso:

char a[] = "HELLO";

Anche in questo caso, da C Faq: Un letterale stringa può essere utilizzato in due modi leggermente diversi. Come un inizializzatore array (come nella dichiarazione di char a []), specifica i valori iniziali dei caratteri in tale matrice. In qualsiasi altro luogo, si trasforma in una serie senza nome, statica di caratteri, che possono essere immagazzinate nella memoria di sola lettura, che è il motivo per cui non si può modificare in modo sicuro. In un contesto di espressione, la matrice viene convertito contemporaneamente per un puntatore, come di consueto (vedi punto 6), quindi la seconda dichiarazione inizializza p per scegliere primo elemento dell'array senza nome.

http://linuxdude.com/Steve_Sumit/C-faq/q1 .32.html

La forma matrice è preferibile per stringhe di questo tipo. I dati e il codice coinvolto prende (molto, molto marginalmente) meno spazio, e la variabile non possono essere modificati per puntare a una stringa differente. (In realtà, non c'è nessuna variabile a tutti, solo un nome per l'indirizzo del primo carattere della stringa -. Si comporta molto simile a un valore letterale in questo senso)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top