阅读 152

带参数的宏定义

当我完成了一个简单的快捷返回UIColor的宏之后:

#define KColor(r,g,b,a) [UIColor k_colorWithRed:r green:g blue:b alpha:a]
复制代码

突然又想到实际开发中经常需要使用到灰色,而UIColor默认只能返回几种默认的几个固定的灰色,不如自己在创建一个灰色的宏:

#define KColorGray(x) KColor(x,x,x,1)
复制代码

看了一秒钟发现不对,这么写肯定有问题,比如下面的情况:

NSInteger gray = 100
self.view.backgroundColor = KColorGray(gray += 50);
复制代码

本来期望的颜色是r:150,g:150,b:150,实际上的颜色是r:150,g:200,b:250,因为宏的定义本质是替换,上面实际上是这样的:

self.view.backgroundColor = KColor(gray += 50,gray += 50,gray += 50,1);
复制代码

所以为了防止这样情况,需要这么写:

#define KColorGray(x) ({\
    NSInteger __color = (x);\
    KColor(__color,__color,__color,1);\
})\
复制代码