【问题标题】:Unexpected results from a macro function宏函数的意外结果
【发布时间】:2011-12-22 09:10:55
【问题描述】:

我定义了一个宏如下:

#define ccpd(__X__, __Y__) (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) ? CGPointMake(__X__ * 0.416667f ,__Y__ * 0.416667f) : CGPointMake(__X__,__Y__)

稍后:

CGPoint p1 = ccpd(1280, 440);
CGPoint p2 = ccpd(1024 + 256, 440);

这是我得到的:

(gdb) p p1
$2 = {
  x = 533.333801, 
  y = 183.333481
}
(gdb) p p2
$3 = {
  x = 1130.66675, 
  y = 183.333481
}

为什么我得到不同的结果?我是否误解了宏的工作原理?

【问题讨论】:

    标签: objective-c c macros c-preprocessor


    【解决方案1】:

    第二种情况下的宏扩展为:

    CGPointMake( 1024 + 256 * 0.416667f, ...
    

    这是

    CGPointMake( 1024 + (256 * 0.416667f), ...
    

    在宏参数周​​围添加括号:

    CGPointMake( (__X__) * 0.416667f, (__Y__) * ...
    

    或者更好:制作一个合适的函数,让编译器优化它。

    【讨论】:

    • 什么不清楚?宏扩展本质上是纯文本替换在编译器正确看到代码之前。这里绝对没有什么棘手的事情。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2012-09-10
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    相关资源
    最近更新 更多