“NSString * __unused aString”和“NSString __unused * aString”是否相同?

时间:2014-01-16 04:04:37

标签: objective-c clang

  1. NSString * __unused aStringNSString __unused * aString是变量声明时,它们是否等效?

  2. 当它们是Objective-C方法参数声明时,- (void)aMethod:(NSString * __unused)aString- (void)aMethod:(NSString __unused *)aString是否等效?

  3. 如果答案是“是”,我认为哪种形式是正确的?

  4. 在启用/禁用GCC_WARN_UNUSED_PARAMETERGCC_WARN_UNUSED_VARIABLE指令时,两种情况下的两种表单似乎都相同。

    我没有找到任何澄清这一点的信息。


    相关主题:

    __unused Flag Behavior/Usage (GCC with Objective C)

2 个答案:

答案 0 :(得分:6)

两者之间存在差异。

当属性__unused出现在星号之前时,它会修饰整个声明列表的主要类型。所有变量都将“未使用”:

__unused NSString *foo, *bar; // OK. All variables are unused in the statement. NSString __unused *foo, *bar; // OK

但是当放在*之后,它只适用于第一个变量:

NSString * __unused foo, *bar; // Unused variable 'bar'

我更喜欢NSString * __unused foo;因为它似乎对我来说更清楚,并且在一个声明中声明多个变量时不会隐藏罕见的情况。

GCC Attribute Syntax引用在第6.31节中提及:

  

属性说明符列表可能出现在声明者之前   (以第一个除外)在逗号分隔的声明符列表中   使用单个列表声明多个标识符   说明符和限定符。这些属性说明符仅适用于   它们出现在其声明者之前的标识符。例如,在

 __attribute__((noreturn)) void d0 (void),
     __attribute__((format(printf, 1, 2))) d1 (const char *, ...),
      d2 (void) 
     

noreturn属性适用于声明的所有函数; format属性仅适用于d1。

答案 1 :(得分:1)

第三个选项的行为类似:__unused NSString *。这似乎至少在Github上更常见。

对于方法声明,还有另一种类似于列表中第二个选项的样式:

- (void)aMethod:(NSString *) __unused aString

我从右到左阅读。通过列表,我将NSString * __unused读作“未使用的指向NSString实例的指针”,并将NSString __unused *读作“指向未使用的NSString实例的指针”。前者,即列表中的#1,对我来说最有意义。

相关问题