Неожиданные результаты от макрофункции - PullRequest
1 голос
/ 22 декабря 2011

Я определил макрос следующим образом:

#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 Ответ

4 голосов
/ 22 декабря 2011

Ваш макрос во втором случае расширяется до чего-то вроде:

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

, что

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

Добавить скобки вокруг параметров макроса:

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

или лучше: создайте правильную функцию и дайте компилятору оптимизировать ее.

...