对于__VA_ARGS__ 的缺点,使用 ##VA_ARGS 直接完美解决!##VA_ARGS 使用如下:
#define edebug(format, …) fprintf (stderr, format, ##VA_ARGS)
如果可变参数被忽略或为空,## 操作将使预处理器(preprocessor)去除掉它前面的那个逗号.
如果你在宏调用时,确实提供了一些可变参数,GNU CPP 也会工作正常,它会把这些可变参数放到逗号的后面。
#define LOG_DBG(fd, fmt, …) CFG_LOG(DBG, fd, fmt, ##VA_ARGS)
#define CFG_LOG(level, fd, fmt, …)
cfg_log(CFG_LOG_##level, fd, "%s(): line:%d " fmt “\n”, func, LINE, ##VA_ARGS)