1)使用VA_ARGS
#define LOG(…) printf (__VA_ARGS__)
#define LOG_ERR(format, …) printf ("[ERR]"format"\n", ##__VA_ARGS__)
#define LOG_ERR(format, …) printf ("[ERR]"format"\n", __VA_ARGS__) //标准C要求至少带有一个参数,GCC可以不带参数
使用##时可变参数可以为空,不会引起编译错误
__VA_ARGS__在标准C中当变参为空时可能出现编译错误
"##"的作用是对token进行连接,如果token为空,那么不进行连接,所以允许省略可变参数(__VA_ARGS__和args),而不出现编译错误
2)args…
#define LOG(args…) printf (args)
args…是GCC遗留的写法,不建议使用。