2014-01-16 21 views
3
  1. 是否NSString * __unused aStringNSString __unused * aString當它們是變量聲明?「NSString * __unused aString」和「NSString __unused * aString」是否相等?

  2. - (void)aMethod:(NSString * __unused)aString- (void)aMethod:(NSString __unused *)aString等價,當它們是Objective-C方法的參數聲明?

  3. 如果答案是「是」,那麼我應該選擇哪種形式是正確的?

在這兩種情況下這兩種形式似乎相同的工作,啓用/禁用GCC_WARN_UNUSED_PARAMETERGCC_WARN_UNUSED_VARIABLE指令時。

我沒有找到任何信息來澄清這一點。


相關話題:

__unused Flag Behavior/Usage (GCC with Objective C)

回答

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

有其行爲類似於第三種選擇:__unused NSString *。至少在Github上這似乎更常見。

方法聲明有類似列表中的第二個選項另一種風格:

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

我從右到左的閱讀。閱讀你的列表,我讀NSString * __unused作爲一個「未使用的指向NSString實例的指針」,並且我讀NSString __unused *作爲「指向未使用的NSString實例的指針」。前者,即列表中的#1,對我最有意義。

+0

感謝您的回答。請參閱[this](https://github.com/AFNetworking/AFNetworking/issues/624)關於不在括號內使用__unused。這就是爲什麼我從我的問題的選項列表中排除它的原因。 –

相關問題