2014-05-20 25 views
5

W this document, w sekcji oznaczonej "Zmienna kwalifikacje", Apple mówi:Co to jest "problem" ze zmiennym miejscem docelowym?

Należy ozdobić prawidłowo zmiennych. Podczas korzystania kwalifikatorów w deklaracji zmiennej obiektu, prawidłowy format:

ClassName * qualifier variableName; 

na przykład:

MyClass * __weak myWeakReference; 
MyClass * __unsafe_unretained myUnsafeReference; 

Inne warianty są technicznie niepoprawne, ale są „odpuszczone” przez kompilator. Aby zrozumieć problem, zobacz http://cdecl.org/.

Patrząc na cdecl.org nic nie wyjaśnia. Czy ktokolwiek może wyjaśnić, o czym jest "problem", o którym im chodzi? Innymi słowy, pomóżcie mi przekonać innych, że ma to znaczenie w sposób, który nie jest tylko "dlatego, że ten jeden fragment mówi".

Odpowiedz

6

Zobacz moje przykłady z bełkotu do angielskich przekładów

Powszechnie wiadomo, że

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

ma inne znaczenie niż

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

lub

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

w samo to deklaracja

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

i ta deklaracja

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

są bardzo różne. Jednak znaczenie drugiego jest jasne (choć technicznie niepoprawne) i może być "wybaczone" przez kompilator.

Poprawność jest nieco ważniejsza po rozpoczęciu pracy ze wskaźnikami do wskaźników (np. Foo * __autoreleasing *).

Zakładam, że chcieli chronić początkujących deweloperów od bełkotu deklaracji C/C++. Posiadanie kwalifikatora na początku wydaje się bardziej naturalne.

+0

Moja reguła to czytanie od prawej do lewej. Na przykład 'ClassName * __weak variableName' będzie odczytywane jako" _variableName_ jest słabym wskaźnikiem do _ClassName_ "Lub dla' char const * string' jaki otrzymasz "string jest wskaźnikiem do stałych znaków" – nielsbot

+0

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

+1

Wiem, jak je czytać :) Od prawej do lewej działa tylko te najprostsze :) – Sulthan