const关键字在变量声明中的位置的重要性

14

请问定位的位置有何意义?

const

在Objective-C中声明变量时使用的关键字,例如:

extern const NSString * MY_CONSTANT;

对比

extern NSString * const MY_CONSTANT;

在赋值中使用第一个版本会产生关于“从指针目标类型丢弃限定符”的警告,因此我认为第二个版本确保了指针地址保持不变。但我真的很希望能得到更确切的答案。提前致谢!

3个回答

14
在第一种情况下,你声明了一个可变指针指向一个不可变的const NSString对象,而在第二种情况下,你声明了一个不可变指针指向一个可变的NSString对象。
要记住这个区别很简单,只需要看*符号出现的位置;它左边的是“指向”的类型,右边的描述了指针的属性。

2
ezod是正确的 - 但是,当NSString被声明为字符串常量时,我看不出添加const的理由。您无法释放NSString,也无法更改它(它不可变)...那么为什么还要使用const? - mr-sk
4
没有人使用const NSString *blah,因为即使是不可变的NSString也可能需要操作它的实例变量(例如缓存),而且一个NSString也可能是NSMutableString。你应该使用NSString *const blah,这样你的其他代码就不会写成if (MY_CONST_STRING = local_string),也可以防止恶意插件将所有常量重写为@"I LIKE MONKEYS" - Jeremy W. Sherman

8
extern const NSString * MY_CONSTANT; 

- 指针是一个变量,但是指针所指向的数据是不可变的。
 extern NSString * const MY_CONSTANT; 

- 指针常量,但指针所指向的数据并非常量。

5
一般而言,const总是应用于const之前的标记。在第二种情况下,const表示指针是一个常量,而不是指向的东西。例外情况是当const出现在任何可以有意义地成为常量的内容之前时,就像你的第一个例子一样。在这种情况下,它应用于第一个类型,即NSString,因此它等同于extern NSString const * MY_CONSTANT

我希望我可以设置两个被接受的答案,因为两个答案都帮助我理解了这个问题。非常感谢大家! - Andy Bowskill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接