iOS 宏定义

初学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

实现条件宏定义

其他:

使用#预处理操作符来实现将宏中的参数转化为字符串

使用##操作符可以实现连接

多行时,在末尾添加‘\’线

参考文章:

宏定义的黑魔法 - 宏菜鸟起飞手册

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容