2008-11-12 109 views
15

是否可以在Objective-C對象方法參數上使用__unused屬性宏?我試着將它放在參數聲明的各個位置,但是它會導致編譯錯誤或似乎被忽略(即編譯器在編譯-Wall -Wextra時仍會生成未使用的參數警告)。在Objective-C中使用GCC __unused屬性

有沒有人能夠使用它?它只是不支持Objective-C嗎?作爲參考,我目前正在使用Apple的GCC 4.0.1版本。

回答

18

好吧,我找到了答案......它似乎是一個執行蘋果的gcc 4.0的錯誤。用gcc 4.2它將按預期工作,並妥善安置如下:

-(void)someMethod:(id) __unused someParam; 

它在Objective-C的發佈記錄筆記,如果有人有興趣:http://developer.apple.com/releasenotes/Cocoa/RN-ObjectiveC/index.html#//apple_ref/doc/uid/TP40004309-DontLinkElementID_6

作爲一個說明,你的答案會編,路易斯,但正如我在我的問題中所述,它實際上不會做任何事情或壓制編譯器發出的未使用警告。

編輯:我提交了一個與此rdar://6366051蘋果的錯誤報告。

2

我可以編譯下面就好了:

- (NSString *) test:(__unused NSString *)test { 
    return nil; 
} 

編輯:其實,這可能不是嚴格意義上的拱的事情:

Phoenix-VI:CouchPusher louis$ cc -c Pusher.m -Wall -Werror 
Phoenix-VI:CouchPusher louis$ cc -c Pusher.m -Wall -Werror -Wunused-parameter 
cc1obj: warnings being treated as errors 
Pusher.m:40: warning: unused parameter ‘test’ 
Phoenix-VI:CouchPusher louis$ 

所以-​​Wall不包括不包括-Wunused-參數....

+0

是的,我可以編譯過,但嘗試的gcc -Wall -Wextra看看會發生什麼:) – 2008-11-12 22:59:30

+0

沒有,沒有按-Wall 't,你需要使用-Wextra ...但是我總是在我的代碼中同時使用-Wall和-Wextra,並且對於未使用的警告噪聲感到惱火。 – 2008-11-12 23:29:04

+0

我使用了-Werror和大多數警告,但是我有一些傳統上關閉的具體警告--Wunused-參數就是其中之一,因爲委託人往往會有不能使用的參數,而這些參數是無法刪除的。 – 2008-11-13 00:19:06

3

我想你可以使用#pragma unused標記參數爲未使用。未經檢驗的,但你可以嘗試像

- (NSString *)test:(NSString *)test { 
#pragma unused (test); 
    return nil; 
} 
+1

您需要將#pragma未使用的變量包含在parens中。所以:#pragma unused(timer)確實有用,但我並不喜歡這種方式。事實證明這是一個錯誤。 – 2008-11-12 23:30:50

3

一個常見的成語是使用以下命令:

#define UNUSED(x) (void)x 
void SomeFunction(int param1, int param2) 
{ 
    UNUSED(param2); 
    // do stuff with param1 
}

UNUSED(param2)語句不產生任何目標代碼,消除了對於未使用的變量警告,並明確將代碼記錄爲不使用變量。

1

將#pragma一會兒的戰鬥後,我發現這是

+ (NSString*) runQuery:(id)query name:(NSString*)name options:(NSDictionary*)options 
{ 
#pragma unused(name) 
... 

}