2014-05-20 16 views
5

In this document, sotto la sezione con l'etichetta "Variable qualificatori", Apple dice:Che cos'è "il problema" con il posizionamento di qualificatore variabile?

Si dovrebbe decorare correttamente le variabili. Quando si utilizza qualificatori in una dichiarazione variabile oggetto, il formato corretto è:

ClassName * qualifier variableName; 

ad esempio:

MyClass * __weak myWeakReference; 
MyClass * __unsafe_unretained myUnsafeReference; 

Altre varianti sono tecnicamente corretto ma vengono “rimessi” by il compilatore. Per comprendere il problema, vedere http://cdecl.org/.

Guardare cdecl.org non chiarisce nulla. Qualcuno può spiegare che "il problema" a cui si riferiscono è? In altre parole, aiutami a convincere gli altri che questo in realtà è importante in un modo che non è solo "perché questo un readme dice così".

risposta

6

Vedere i miei esempi con parole senza senso a Inglese

E 'ben noto che

ClassName * const varName; //varName is a constant pointer to ClassName 

ha significato diverso rispetto

const ClassName * varName; //varName is a pointer to constant ClassName 

o

ClassName const * varName; //varName is a pointer to constant ClassName 

Nel Allo stesso modo questa dichiarazione

ClassName * __weak varName; //varName is a weak pointer to ClassName 

e questa dichiarazione

__weak ClassName * varName; //varName is a pointer to weak?? ClassName?? 

sono molto diversi. Tuttavia, il significato del secondo è chiaro (anche se è tecnicamente scorretto) e può essere "perdonato" dal compilatore.

La correttezza è un po 'più importante una volta iniziato a lavorare con i puntatori ai puntatori (ad esempio Foo * __autoreleasing *).

Suppongo che volessero proteggere gli sviluppatori principianti dalla dichiarazione senza senso della dichiarazione C/C++. Avere la qualifica all'inizio sembra più naturale.

+0

La mia regola generale è quella di leggere questi da destra a sinistra. Quindi, ad esempio 'ClassName * __weak variableName' potrebbe essere visualizzato come" _variableName_ è un puntatore debole a un _ClassName_ "O per' char const * string' ottieni "stringa è un puntatore a const char" – nielsbot

+0

cf http: // eli. thegreenplace.net/2008/07/18/reading-c-type-declarations/ – nielsbot

+1

So come leggerli :) Da destra a sinistra funziona solo per i più semplici :) – Sulthan

Problemi correlati