C++可变参数宏,函数,模板

可变参数宏

// 方法1:
// ...表示可变参数列表
#define LOG(format, args...) fprintf(stdout, format, args)
LOG("%s","123"); //正确
LOG("123");      //错误   展开后,相当与LOG(,"123")

// 方法2:
#define LOG(format, args...) fprintf(stdout, format, ##args)
LOG("%s","123"); //正确
LOG("123");      //正确  ##加上后不会进行连接。
##”连接符号的用法,“##”的作用是对token进行连接,上例中format,args都可以看作是token,如果token为空,“##”则不进行连接,所以允许省略可变参数
因为format这个token为空,又因为有##的加持,所以不连接。

// 方法3:
#define LOG(...) fprintf(stdout, __VA_ARGS__)
LOG("%s","123"); //正确
LOG("123");      //正确
//生产环境与测试环境切换操作
#ifdef DEBUG
#define LOG(format, ...) fprintf(stdout, ">> "format"\n", ##__VA_ARGS__)
#else
#define LOG(format, ...)
#endif

可变参数函数

可变参数模板

动态设置位宽

printf("[%*d]", 12, 25);
// 输出: [          25]

参考链接
https://www.cnblogs.com/lanjianhappy/p/8670384.html
https://blog.csdn.net/qu1993/article/details/90606249
c语言可变参数与宏定义
https://www.cnblogs.com/wzd5230/p/10959032.html
https://www.cnblogs.com/xyang0917/p/4172493.html
https://blog.csdn.net/wukery/article/details/53286348

posted @ 2021-12-25 13:03  憶藝  阅读(107)  评论(0)    收藏  举报