2010-01-17 7 views
12

Qual è il significato del posizionamento della parola chiaveImportanza posizionamento parola chiave const in dichiarazioni di variabili

const 

quando si dichiara una variabile in Objective-C, per esempio:

extern const NSString * MY_CONSTANT; 

contro

extern NSString * const MY_CONSTANT; 

L'utilizzo della prima versione in assegnazioni genera avvisi relativi a "qualificazioni fr om pointer target type "viene scartato, quindi presumo che la seconda versione assicuri che l'indirizzo del puntatore rimanga lo stesso. Gradirei davvero una risposta più definitiva. Molte grazie in anticipo!

risposta

13

Nel primo caso, si dichiara un puntatore mutabile a un oggetto immutabile const NSString, mentre nel secondo caso si dichiara un puntatore immutabile a un oggetto mutabile NSString.

Un modo semplice per ricordare questo è guardare dove si trova il *; tutto a sinistra di esso è il tipo "punta", e tutto a destra di esso descrive le proprietà del puntatore.

+2

ezod è corretto - Tuttavia, non vedo il ragionamento nell'aggiungere il const, quando un NSString è dichiarato come costante di stringa. Non è possibile rilasciare una NSString e non è possibile cambiarla (non è modificabile) ... quindi perché preoccuparsi di w/const? –

+4

Nessuno usa 'const NSString * blah' perché anche una NSString immutabile potrebbe dover manipolare i suoi ivars (ad esempio, la memorizzazione nella cache) e una NSString potrebbe anche essere una NSMutableString. Usi 'NSString * const blah' in modo che alcuni dei tuoi altri codici non facciano' if (MY_CONST_STRING = local_string) 'e un plugin dannoso non può riscrivere tutte le tue costanti per essere' @ 'I LIKE MONKEYS' '. –

5

In generale, const si applica sempre al token poco prima dello const. Nel secondo caso, il const significa che il puntatore è una costante, non la cosa puntata. L'eccezione è quando lo const appare prima di tutto ciò che può essere significativamente costante, come nel tuo primo esempio. In questo caso si applica al primo tipo, in questo caso NSString, in modo equivalente per extern NSString const * MY_CONSTANT

+0

Vorrei poter impostare due risposte accettate, entrambe mi hanno aiutato a capirlo. Molte grazie ragazzi! –

6
extern const NSString * MY_CONSTANT; 

- Pointer è variabile, ma i dati indicata dal puntatore è costante.

extern NSString * const MY_CONSTANT; 

- Pointer costante, ma i dati puntati da puntatore non è costante.