在预处理器宏中包装内联C函数

时间:2014-04-10 18:30:15

标签: objective-c c core-graphics

CGGeometry.h的底部,声明了以下函数和宏定义:

CG_INLINE bool
__CGPointEqualToPoint(CGPoint point1, CGPoint point2)
{
  return point1.x == point2.x && point1.y == point2.y;
}
#define CGPointEqualToPoint __CGPointEqualToPoint

CG_INLINE bool
__CGSizeEqualToSize(CGSize size1, CGSize size2)
{
  return size1.width == size2.width && size1.height == size2.height;
}
#define CGSizeEqualToSize __CGSizeEqualToSize

我的问题,出于好奇,为什么要声明CGPointEqualToPointCGSizeEqualToSize宏?为什么不直接使用内联函数定义,就像在它们上面声明的所有CG...Make函数一样?像这样:

CG_INLINE CGPoint
CGPointMake(CGFloat x, CGFloat y)
{
  CGPoint p; p.x = x; p.y = y; return p;
}

CG_INLINE CGSize
CGSizeMake(CGFloat width, CGFloat height)
{
  CGSize size; size.width = width; size.height = height; return size;
}

1 个答案:

答案 0 :(得分:3)

旧版CoreGraphics用于将符号声明为

extern int CGPointEqualToPoint(CGRect rect1, CGRect rect2);
extern int CGSizeEqualToSize(CGRect rect1, CGRect rect2);

随着CoreGraphics的发展,有人认为这些方法的实现非常简单,这些内容在CoreGraphics首次编写时未被考虑或未采取行动。简单地弃用旧的非内联版本可能会引入二进制不兼容性(一个积极足够的内联器,甚至不会发出符号,而是一个旧的应用程序,寻找该符号会被炸毁)。定义只是旧标识符的补丁,所以你看到的只是新定义,而不是旧符号。

相关问题