来自宏功能的意外结果

时间:2011-12-22 09:10:55

标签: objective-c c macros c-preprocessor

我按如下方式定义了一个宏:

#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
}

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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