【问题标题】:What is "the issue" with variable qualifier placement?可变限定符放置的“问题”是什么?
【发布时间】:2014-07-09 01:52:33
【问题描述】:

this document 中,在标有“变量限定符”的部分下,Apple 说:

你应该正确地装饰变量。在对象变量声明中使用限定符时,正确的格式是:

ClassName * qualifier variableName;

例如:

MyClass * __weak myWeakReference;
MyClass * __unsafe_unretained myUnsafeReference;

其他变体在技术上是不正确的,但已被编译器“原谅”。要了解该问题,请参阅http://cdecl.org/

查看 cdecl.org 并不能说明任何问题。谁能解释他们所指的“问题”是什么?换句话说,帮助我说服其他人这实际上很重要,而不仅仅是“因为这个自述文件是这么说的”。

【问题讨论】:

    标签: objective-c syntax qualifiers


    【解决方案1】:

    看看我的例子,把乱码翻译成英文

    众所周知

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

    有不同的含义
    const ClassName * varName; //varName is a pointer to constant ClassName
    

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

    以同样的方式声明

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

    还有这个声明

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

    非常不同。但是,第二个的意思很清楚(虽然从技术上讲是不正确的),编译器可以“原谅”它。

    一旦你开始使用指向指针的指针(例如Foo * __autoreleasing *),正确性就变得更加重要了。

    我假设他们希望保护初学者免受 C/C++ 声明乱码的影响。一开始就有限定词似乎更自然。

    【讨论】:

    • 我的经验法则是从右到左阅读这些内容。因此,例如,ClassName * __weak variableName 将读作“variableName 是指向 ClassName 的弱指针”,或者对于 char const * string,您会得到“字符串是指向 const chars 的指针”
    • 我知道如何阅读它们:) 从右到左只适用于最简单的:)
    • 我是这么认为的,我的意思是我的评论是您回答的额外背景
    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2018-10-24
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多