试图了解宏的操作顺序

时间:2013-12-13 15:21:25

标签: ios objective-c macros

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)
#define HEIGHT IS_IPHONE5 ? 568 : 480

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"HEIGHT: %d",HEIGHT);
    NSLog(@"HEIGHT: %d",HEIGHT+99);
}

上述两个日志都会产生 568 。我猜这是因为操作的顺序而发生的。任何人都能给我一个很好的解释吗?

(我不是在寻找解决方案或替代方法来做上述事情。只是解释为什么会发生这种情况)

2 个答案:

答案 0 :(得分:2)

NSLog(@"hight: %d",HIGHT+99);

将扩展为

 NSLog(@"hight: %d",IS_IPHONE5 ? 568 : 480+99);

然后

NSLog(@"hight: %d",(([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) ? 568 : 480+99);

所以它会产生568

<强>解决方案

NSLog(@"hight: %d",(HIGHT)+99);

#define HIGHT (IS_IPHONE5 ? 568 : 480)

我建议使用第二种解决方案。

答案 1 :(得分:1)

像你一样的宏只是在编译时被替换。编译代码后,代码就是:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"hight: %d",(([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) ? 568 : 480);
    NSLog(@"hight: %d",(([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) ? 568 : 480+99);
}