初学ios不久时间,对ios的宏定义充满好奇,宏的各种高级用法让ios代码变得优雅,那么宏究竟是什么,让我来花时间记录学习一下。
宏定义使用关键字#define,分为对象宏(object-like macro)和函数宏(function-like macro)。
对象宏:
// 定义:#define PI 3.14159265358979323846264338327950288
// 使用:double circlePerimeter = 2 * PI * 10.0;
函数宏:
// 定义:#define MIN(A,B) A < B ? A : B
// 使用:MIN(1,2) // 1
预定义宏:
前后双下杠的一般都是预定义宏,例如__FILE__返回当前文件的绝对路径,__VA_ARGS__表示宏定义中的...中的所有剩余参数。
高级用法:
#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; })
括号里定义一个方法,为防止在A的部分传入运算,所以优先以输入的类型申明了__a和__b,并使用输入为其赋值,这样是为了避免A或B的运算在代码中被运算多次导致出错。
#define TEST do { xxx } while(0)
do while(0) 写法表面上看多余,但是解决了分号的问题,如果xxx代表一个代码段,那么当这个代码段被替换后,可能会因为末尾的分号导致错误发生。
#define NSLog(format, ...) fprintf(format, __VA_ARGS__)
...是可变参数列表,它可以代表一个、两个,或者是很多个参数,但同时它也能代表零个参数,使用标识符__VA_ARGS_来表示宏定义中的...中的所有剩余参数。用一个例子来说明:
#define bb_argcount(...) bb_at(10, __VA_ARGS__,10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
#define bb_at(N,...) bb_concat_at##N (__VA_ARGS__)
#define bb_concat_at10(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,...) bb_head(__VA_ARGS__)
#define bb_head(...) bb_head_first(__VA_ARGS__,0)
#define bb_head_first(first,...) first
//调用示例:int count=bb_argcount(a,b,c,d,e); NSLog(@" count is :%d",count);
//输出: count is :5
#ifdef DEBUG
#define xxx
#else
#define xxx
#endif
实现条件宏定义
其他:
使用#预处理操作符来实现将宏中的参数转化为字符串
使用##操作符可以实现连接
多行时,在末尾添加‘\’线
参考文章:
网友评论