【问题标题】:Trying to understand the operation sequence of macros试图理解宏的操作顺序
【发布时间】:2013-12-13 15:21:24
【问题描述】:
#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。我猜这是因为操作的顺序而发生的。谁能给我一个很好的解释?

(我不是在寻找解决方案或执行上述操作的替代方法。只是解释为什么会发生这种情况)

【问题讨论】:

    标签: ios objective-c macros


    【解决方案1】:

    这个

    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)
    

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

    【讨论】:

    • 这只是其中的一部分。
    • @rmaddy:是的,它还会进一步扩展另一个宏。编辑我的答案。谢谢
    【解决方案2】:

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

    - (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);
    }
    

    【讨论】:

    • 你所说的“像你一样的宏”是什么意思?介意将我链接到其他类型的宏吗?
    • 也许这是误导性的措辞。所有宏都在编译时被替换,但有更复杂的宏语法。请参阅en.wikipedia.org/wiki/… 并查看“特殊宏和指令”。
    猜你喜欢
    • 2017-07-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2019-10-19
    • 1970-01-01
    相关资源
    最近更新 更多