一些宏使用总结

时间:2021-11-09 01:14:27

在开发过程中总会有一些的语句经常被用到,对于这些,使用宏定义用起来会更好。

比如在定位问题时需要打印一些信息时,可能需要定位到打印的文件、函数、行号等等信息,这时候可以做这样一些优化

#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++谁更好的观点一样,其实他们都是一种工具,

合适的场景使用合适的工具才是重要的,君子性非异也,善假于物也。