在Objective-C中使用GCC __unused属性

时间:2008-11-12 22:19:59

标签: objective-c gcc

是否可以在Objective-C对象方法参数上使用__unused属性宏?我已经尝试将它放在参数声明周围的各个位置,但它会导致编译错误或者似乎被忽略(即编译器在使用-Wall -Wextra进行编译时仍然会生成未使用的参数警告。)

有没有人能够使用它?它只是不支持Objective-C吗?作为参考,我目前正在使用Apple的GCC 4.0.1版本。

5 个答案:

答案 0 :(得分:18)

好的,我找到了答案......这似乎是Apple的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提交了一份关于苹果的错误报告。

答案 1 :(得分:3)

我认为您可以使用#pragma unused将参数标记为未使用。未经测试,但您可以尝试类似

的内容
- (NSString *)test:(NSString *)test {
#pragma unused (test);
  return nil;
}

答案 2 :(得分:3)

一个常见的习语是使用以下内容:

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

UNUSED(param2)语句不生成任何目标代码,消除有关未使用变量的警告,并清楚地将代码记录为不使用变量。

答案 3 :(得分: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-parameter ....

答案 4 :(得分:1)

与#pragma战斗了一段时间后,我发现它是

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

}