我刚刚了解了在使用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;
该__unused
宏(这实际上是扩大到__attribute__((unused))
GCC属性)只告诉编译器:“如果我不使用这个变量不提醒我”。
unused
:此属性附加到变量,表示该变量可能未被使用。GCC不会对此变量发出警告。(资料来源:gnu.gcc.org doc)
因此,此GCC属性是在不使用变量时避免发出警告,而在使用声称未使用的变量时不触发警告。
关于在最后一个示例中将属性放在变量名之前或之后,在您的情况下,这两者都被接受并且等效:为了兼容性起见,编译器只宽容该位置(当然,您也可以同时编写const int i
or int const i
)
为了与为未在嵌套声明器上实现属性的编译器版本编写的现有代码兼容,在放置属性时允许一些宽松性(来源:gnu.gcc.org doc)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句