Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Objective C const NSString * vs NSString * const

I'm trying to a NSString constant in my .h file to be defined in my .m. I understand that
extern NSString * const variableName; in the .h and
NSString * const variableName = @"variableValue"; is the way to do this. Examining c tutorials I see that const is supposed to go before variable definitions. My question is why is it not declared as extern const NSString * variableName; in the .h and const NSString * variableName = @"variableValue"; in the .m. I know this doesn't work because I encounter compiler warnings which say 'Passing argument 1 of methodName: discards qualifiers from pointer target type'. What does this mean?

like image 343
dhatch387 Avatar asked Jul 07 '10 15:07

dhatch387


2 Answers

It's not the same. The const modifier can be applied to the value, or the pointer to the value.


int * const 

A constant pointer (not modifiable) to an integer (its value can be modified)


const int * 

A modifiable pointer to a constant integer (its value can't be modified)


So you can imagine:

const int * const; 
like image 59
Macmade Avatar answered Sep 19 '22 05:09

Macmade


Constant pointer is NOT a pointer to constant. Constant pointer means the pointer is constant. E.g. constant pointer int * const ptr2; indicates that ptr2 is a pointer which is constant. This means that ptr2 cannot be made to point to another integer. However, the integer pointed by ptr2 can be changed.

Whereas a pointer to constant const int * ptr1; indicates that ptr1 is a pointer that points to a constant integer. The integer is constant and cannot be changed. However, the pointer ptr1 can be made to point to some other integer.

like image 27
Jogi Thakur Avatar answered Sep 20 '22 05:09

Jogi Thakur