【问题标题】:Significance of const keyword positioning in variable declarations变量声明中 const 关键字定位的意义
【发布时间】:2011-01-06 04:04:43
【问题描述】:

定位的意义是什么

const

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

extern const NSString * MY_CONSTANT;

extern NSString * const MY_CONSTANT;

在分配中使用第一个版本会产生关于“来自指针目标类型的限定符”被丢弃的警告,所以我假设第二个版本确保指针地址保持不变。不过,我真的很感激一个更明确的答案。非常感谢!

【问题讨论】:

    标签: objective-c constants keyword compiler-warnings


    【解决方案1】:

    在第一种情况下,您声明了一个指向不可变 const NSString 对象的可变指针,而在第二种情况下,您声明了一个指向可变 NSString 对象的不可变指针。

    记住这一点的一个简单方法是查看* 的位置;它左边的一切都是“pointee”类型,它右边的一切都描述了指针的属性。

    【讨论】:

    • ezod 是正确的 - 但是,当 NSString 被声明为字符串常量时,我​​看不到添加 const 的原因。你不能释放一个 NSString 也不能改变它(它不是可变的)......那为什么还要打扰 const 呢?
    • 没有人使用const NSString *blah,因为即使是不可变的 NSString 也可能需要操作其 ivars(例如缓存),而 NSString 也可能是 NSMutableString。您使用NSString *const blah,这样您的一些其他代码就不会执行if (MY_CONST_STRING = local_string),并且恶意插件无法将您的所有常量重写为@"I LIKE MONKEYS"
    【解决方案2】:

    一般来说,const 总是适用于 const 之前的令牌。在第二种情况下,const 意味着指针是一个常量,而不是指向的东西。例外情况是const 出现在任何有意义的常量之前,就像在您的第一个示例中一样。在这种情况下它适用于第一种类型,在这种情况下是NSString,所以它相当于extern NSString const * MY_CONSTANT

    【讨论】:

    • 我希望我可以设置两个接受的答案,这两个都帮助我理解了这一点。非常感谢你们!
    【解决方案3】:
    extern const NSString * MY_CONSTANT; 
    

    - 指针是可变的,但指针指向的数据是不变的。

     extern NSString * const MY_CONSTANT; 
    

    - 指针常量,但指针指向的数据不是常量。

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 2018-11-07
      • 2015-02-15
      • 2018-06-02
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      相关资源
      最近更新 更多