【发布时间】:2008-11-12 22:19:58
【问题描述】:
是否可以在 Objective-C 对象方法参数上使用 __unused 属性宏?我尝试将它放置在参数声明周围的不同位置,但它要么导致编译错误,要么似乎被忽略(即编译器在使用 -Wall -Wextra 编译时仍会生成未使用的参数警告)。
有人能用这个吗? Objective-C 不支持它吗?作为参考,我目前正在使用 Apple 构建的 GCC 4.0.1。
【问题讨论】:
标签: objective-c gcc
是否可以在 Objective-C 对象方法参数上使用 __unused 属性宏?我尝试将它放置在参数声明周围的不同位置,但它要么导致编译错误,要么似乎被忽略(即编译器在使用 -Wall -Wextra 编译时仍会生成未使用的参数警告)。
有人能用这个吗? Objective-C 不支持它吗?作为参考,我目前正在使用 Apple 构建的 GCC 4.0.1。
【问题讨论】:
标签: objective-c gcc
好的,我找到了答案……这似乎是 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
请注意,Louis,您的答案将被编译,但正如我在问题中所说,它实际上不会做任何事情或抑制编译器发出的未使用警告。
编辑:我为此rdar://6366051 向苹果提交了错误报告。
【讨论】:
一个常见的习惯用法是使用以下内容:
#define UNUSED(x) (void)x
void SomeFunction(int param1, int param2)
{
UNUSED(param2);
// do stuff with param1
}
UNUSED(param2) 语句不生成任何目标代码,消除有关未使用变量的警告,并清楚地将代码记录为未使用变量。
【讨论】:
我认为您可以使用#pragma used 将参数标记为未使用。未经测试,但您可以尝试类似
- (NSString *)test:(NSString *)test {
#pragma unused (test);
return nil;
}
【讨论】:
我可以很好地编译以下内容:
- (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....
【讨论】:
在与#pragma 斗争了一段时间后,我发现它是
+ (NSString*) runQuery:(id)query name:(NSString*)name options:(NSDictionary*)options
{
#pragma unused(name)
...
}
【讨论】: