1、__VA_ARGS__ 是一个可变参数的宏,在宏前边加上##的作用是,当可变参数的个数为0时,这里的##会把前边多余的“,”去掉,否则会编译出错
2、__FILE__ 宏在预编译时会替换成当前的原文件名
3、__LINE__ 宏在预编译时会替换成当前行号
4、__func__ 宏在预编译时会替换成当前函数名
for example:
#define dprintf(fmt, args...) \
do { \
log_write(LOG_DEBUG, __func__, __LINE__, fmt, ##args); \
} while (0)