__unused标记行为/用法(GCC与Objective-C)

时间:2013-11-01 22:01:35

标签: ios objective-c gcc

我刚刚了解了在使用GCC进行编译时可以使用的__unused标志,我对它的了解越多,我的问题就越多......

为什么编译没有警告/错误?我特意告诉编译器我不会使用变量似乎很奇怪,然后当我使用它时,事情就会正常进行。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self foo:0];
}

- (void)foo:(NSInteger)__unused myInt
{
    myInt++;
    NSLog(@"myInt: %d", myInt);  // Logs '1'
}

另外,以下两种方法签名之间有什么区别?

- (void)foo:(NSInteger)__unused myInt;

- (void)foo:(NSInteger)myInt __unused;

2 个答案:

答案 0 :(得分:77)

__unused宏(实际上扩展为__attribute__((unused)) GCC属性)只告诉编译器“如果我不使用这个变量就不要警告我。”

  

unused:此属性附加到变量,表示该变量可能未使用。 GCC不会对此变量发出警告。 Source: gnu.gcc.org doc

因此,当您不使用变量时,此GCC属性为避免警告;当您使用未声明未使用的变量时,不触发。< / p>


关于在上一个示例中将变量名称之前或之后放置属性,在您的情况下,两者都被接受并且等效:编译器只是为了兼容性而对该放置非常宽容(就像您也可以同时编写{{} 1}}或const int i

  

为了与为嵌套声明符实现属性的编译器版本编写的现有代码兼容,在放置属性时允许一些松弛Source: gnu.gcc.org doc

答案 1 :(得分:10)

从Xcode 7.3.1开始,目前没有区别:

- (void)foo:(NSInteger)__unused myInt;// [syntax 1]
- (void)foo:(NSInteger __unused)myInt;// [syntax 2]
- (void)foo:(__unused NSInteger)myInt;// [syntax 3]

但以下情况并不奏效:

- (void)foo:(NSInteger)myInt __unused;// [doesn't work]

用于此目的,Apple recommends first syntax。 (information was partially taken from this answer

但是:

之间存在差异
__unused NSString *foo, *bar;  // [case a] attribute applies to foo and bar
NSString *foo __unused, *bar;  // [case b] attribute applies to foo only

NSString * __unused foo, *bar; // [case c] attribute applies to foo only
NSString __unused *foo, *bar;  // [case d] attribute applies to foo and bar
CFStringRef __unused foo, bar; // [case e] attribute applies to foo and bar

如果我们希望__unused适用于所有语法,则语法[a]是我个人最好的,因为它不会产生歧义。

如果我们希望__unused适用于一个,语法[b]是我个人最好的,因为它没有任何含糊之处。

后三种解决方案是可以接受的,但在我看来令人困惑。 (information was partially taken from this answer