宏定義
https://www.cnblogs.com/wzd5230/p/10959032.html
https://www.cnblogs.com/xyang0917/p/4172493.html
https://blog.csdn.net/wukery/article/details/53286348
//...表示可變參數列表
#define LOG(format, args...) fprintf(stdout, format, args)
LOG("%s","123"); //正確
LOG("123"); //錯誤 展開后,相當與LOG(,"123")
#define LOG(format, args...) fprintf(stdout, format, ##args)
LOG("%s","123"); //正確
LOG("123"); //正確 ##加上后不會進行連接。
##”連接符號的用法,“##”的作用是對token進行連接,上例中format,args都可以看作是token,如果token為空,“##”則不進行連接,所以允許省略可變參數
因為format這個token為空,又因為有##的加持,所以不連接。
//生產環境與測試環境切換操作
#ifdef DEBUG
#define LOG(format, ...) fprintf(stdout, ">> "format"\n", ##__VA_ARGS__)
#else
#define LOG(format, ...)
#endif
可變參數編程
https://www.cnblogs.com/edver/p/8419807.html
https://www.runoob.com/cprogramming/c-variable-arguments.html
https://blog.csdn.net/ericbar/article/details/79558827