定义常量宏
在代码中用宏代替常量,使代码含义更明确:
#define M_PI 3.14159265358979323846264338327950288
定义函数宏
最小值函数
如果你想要定义一个取最小值函数,不想写一个函数,不想使用函数频繁的开销系统资源,想用更轻量级的函数宏来解决,一般你会写:
#define MIN(A,B) ((A) < (B) ? (A) : (B))
这种写法其实存在问题,应该是下面这种行,想一想上面的A如果是x++,结果是什么?下面这种写法可以避免这种问题。
#define __NSX_PASTE__(A,B) A##B
#define MIN(A,B) __NSMIN_IMPL__(A,B,__COUNTER__)
#define __NSMIN_IMPL__(A,B,L) ({ __typeof__(A) __NSX_PASTE__(__a,L) = (A); \
__typeof__(B) __NSX_PASTE__(__b,L) = (B); \
(__NSX_PASTE__(__a,L) < __NSX_PASTE__(__b,L)) ? __NSX_PASTE__(__a,L) : __NSX_PASTE__(__b,L); \
})
日志函数
在C中debug时,我们经常用到的就是日志函数,如果原来的日志函数打印的信息不足于满足要求,我这时候就可以简单的通过定义宏函数的方式,更新原本的函数打印。
//A better version of NSLog
#define NSLog(format, ...) do { \
fprintf(stderr, "<%s : %d> %s\n", \
[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \
__LINE__, __func__); \
(NSLog)((format), ##__VA_ARGS__); \
fprintf(stderr, "-------\n"); \
} while (0)
至于为啥要把语句段放到do-whille里,你想要了解的可以看看下面的这篇C系语言中宏定义的详细解释,虽然有些冗长,但是讲的很详细,值得一看:宏定义的黑魔法