objective-c - 宏函数的意外结果

标签 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
}

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

最佳答案

在第二种情况下你的宏扩展成类似这样的东西:

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

这是

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

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

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

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

关于objective-c - 宏函数的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8601591/

相关文章:

c - Flex 未编译词法分析器 - 宏错误

objective-c - 在自动生成的 Swift 桥接 header 中“找不到接口(interface)声明”

c - 如何将汇编程序值返回给 C Int 指针?

c - 终止带有 else 子句的 if … else if 有什么好处?

dictionary - 用于创建 map 的 Clojure 宏

c - Emacs - 有关 hide-ifdef-mode 的问题

ios - 如果我们使用 GCD,我们需要声明一个属性 atomic 吗?

objective-c - UIBarButtonItem 没有响应点击

ios - 当应用程序在后台时 didReceiveRemoteNotification 不使用 Firebase 调用

c - 在C语言中如何读取这个函数?