在开发过程中总会有一些的语句经常被用到,对于这些,使用宏定义用起来会更好。
比如在定位问题时需要打印一些信息时,可能需要定位到打印的文件、函数、行号等等信息,这时候可以做这样一些优化
#define iprint(fmt, ...) printf("[%s-%04d] "fmt"\n", __FILE__, __LINE__, ##__VA_ARGS__)
如果要在打印中加入时间等信息,比如精确到毫秒级别,则需要借助do{}while(0)。
在释放内存时,为了防止野指针出现,可以定义下面的宏
#define FREE_RES(res) if (res) free(res), res = NULL
#define DELETE_RES(res) if (res) delete res, res = NULL
注意,free后面是逗号。如果是分号,需要这么写
#define FREE_RES(res) do {\
if (res) { \
free(res);\
res = NULL;\
}\
}while(0)
有时候为了方便也把一些常用的函数定义一个宏,有时候只是为了少写些东西,比如memset定义为一个宏
#define ZERO(dst, size) memset(dst, 0, size)此外还有如下一些常被定义的宏
#define ARRAYLEN(arr) (sizeof(arr)/sizeof(arr[0]))
#define min(a, b) (a) > (b) ? (b) : (a)
#define max(a,b) (a) > (b) ? (a) : (b)
#define swap(a, b) do {\
x ^= y;\
y ^= x;\
x ^= y;\
}while(0)
实际项目中,会有比这更多的一些宏定义,总而言之都只是为了简便,便于使用。现在很多观点都认为宏不如inline函数,后者提供安全检查。
个人认为自己定义的宏必须清除这些宏什么意义,宏的目的是什么,局限性是什么。就跟c与c++谁更好的观点一样,其实他们都是一种工具,
合适的场景使用合适的工具才是重要的,君子性非异也,善假于物也。