2010-01-17 10 views
12

Jakie jest znaczenie pozycjonowaniaZnaczenie const pozycjonowania słów kluczowych w deklaracji zmiennych

const 

hasła podczas deklarowania zmiennej w Objective-C, na przykład:

extern const NSString * MY_CONSTANT; 

kontra

extern NSString * const MY_CONSTANT; 

Używanie pierwszej wersji w zadaniach tworzy ostrzeżenia o "kwalifikacjach" om docelowy typ wskaźnika "jest odrzucany, więc zakładam, że druga wersja zapewnia, że ​​adres wskaźnika pozostaje taki sam. Naprawdę doceniłbym jednak bardziej jednoznaczną odpowiedź. Z góry bardzo dziękuję!

Odpowiedz

13

W pierwszym przypadku deklarujesz zmienny wskaźnik na niezmienny obiekt const NSString, podczas gdy w drugim przypadku deklarujesz niezmienny wskaźnik na zmiennym obiekcie NSString.

Łatwym sposobem na zapamiętanie tego jest sprawdzenie, gdzie znajduje się *; wszystko na lewo od niego to typ "pointee", a wszystko na prawo od niego opisuje właściwości wskaźnika.

+2

ezod jest poprawny - nie widzę jednak uzasadnienia dodania stałej, gdy NSString jest zadeklarowane jako stała łańcuchowa. Nie możesz zwolnić NSString i nie możesz go zmienić (nie można go zmienić) ... więc po co zawracać sobie głowę konstelacją? –

+4

Nikt nie używa 'const NSString * blah', ponieważ nawet niezmienny NSString może wymagać manipulowania swoimi kolorami (np. Buforowanie), a NSString może być również NSMutableString. Używasz 'NSString * const blah', aby niektóre z twoich innych kodów nie robiły' if (MY_CONST_STRING = local_string) 'i złośliwa wtyczka nie może przepisać wszystkich twoich stałych na' @ "I LIKE MONKEYS" '. –

5

Ogólnie rzecz biorąc, const zawsze stosuje się do tokena tuż przed const. W drugim przypadku const oznacza, że ​​wskaźnik jest stałą, a nie wskazywaną rzeczą. Wyjątkiem jest sytuacja, w której const pojawia się przed wszystkim, co może być znaczące, jak w pierwszym przykładzie. W tym przypadku stosuje się do pierwszego typu, w tym przypadku NSString, więc jego odpowiednik extern NSString const * MY_CONSTANT

+0

Chciałbym ustawić dwie akceptowane odpowiedzi, obie pomogły mi to zrozumieć. Wielkie dzięki chłopaki! –

6
extern const NSString * MY_CONSTANT; 

- Wskaźnik jest zmienna, ale dane wskazywanego przez wskaźnik jest stały.

extern NSString * const MY_CONSTANT; 

- Stała wskaźnika, ale dane wskazywane przez wskaźnik nie są stałe.

Powiązane problemy