变量限定符位置的"问题"是什么?

i_a*_*orf 5 syntax objective-c qualifiers

本文档中,在标记为"可变限定符"的部分下,Apple说:

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

ClassName * qualifier variableName;
Run Code Online (Sandbox Code Playgroud)

例如:

MyClass * __weak myWeakReference;
MyClass * __unsafe_unretained myUnsafeReference;
Run Code Online (Sandbox Code Playgroud)

其他变体在技术上是不正确的,但编译器"原谅"了.要了解此问题,请访问http://cdecl.org/.

查看cdecl.org并未澄清任何内容.任何人都可以解释他们所指的"问题"是什么?换句话说,帮助我说服别人,这实际上不仅仅是因为"因为这篇自述文件是这么说的".

Sul*_*han 6

查看我的例子,带有乱码到英文的翻译

众所周知

ClassName * const varName; //varName is a constant pointer to ClassName
Run Code Online (Sandbox Code Playgroud)

有不同的意义

const ClassName * varName; //varName is a pointer to constant ClassName
Run Code Online (Sandbox Code Playgroud)

要么

ClassName const * varName; //varName is a pointer to constant ClassName
Run Code Online (Sandbox Code Playgroud)

以同样的方式宣言

ClassName * __weak varName; //varName is a weak pointer to ClassName
Run Code Online (Sandbox Code Playgroud)

和这个宣言

__weak ClassName * varName; //varName is a pointer to weak?? ClassName??
Run Code Online (Sandbox Code Playgroud)

非常不同.但是,第二个的含义是明确的(虽然它在技术上是不正确的)并且它可以被编译器"原谅".

一旦你开始使用指针指针(例如Foo * __autoreleasing *),正确性就更重要了.

我假设他们想要保护初学者开发人员免受C/C++声明乱码.在开始时使用限定符似乎更自然.