当NSString * __unused aString
和NSString __unused * aString
是变量声明时,它们是否等效?
当它们是Objective-C方法参数声明时,- (void)aMethod:(NSString * __unused)aString
和- (void)aMethod:(NSString __unused *)aString
是否等效?
如果答案是“是”,我认为哪种形式是正确的?
在启用/禁用GCC_WARN_UNUSED_PARAMETER
和GCC_WARN_UNUSED_VARIABLE
指令时,两种情况下的两种表单似乎都相同。
我没有找到任何澄清这一点的信息。
相关主题:
答案 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,对我来说最有意义。