2008-11-12 32 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) 
... 

}