日志打印或者格式字符串时,可能会用到不定参数的使用,这里记录一下。
格式化字符串有很多方法:
- snprintf
- std::stringstream
- # ##的使用
##是一个连接符号,用于把参数连在一起
#是“字符串化”的意思,出现在宏定义中的#是把跟在后面的参数转换成一个字符串
并且# ##都只能出现在宏定义中
include <stdio.h>
#define test(n) printf("arg" #n " = %d
", arg##n)
int main(){
int arg9 = 5;
test(9); //arg9 = 5
return 0;
}
- 有时候需要自己调用vsprintf
#include <stdio.h>
#include <stdarg.h>
#include <string>
void format_args(std::string &res, const char* format, ...){
char buffer[256];
va_list args;
va_start(args, format);
//使用vsnprintf避免buff不足, 出core
vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
res = buffer;
}
int main(){
int arg1 = 5;
std::string arg2 = "OK";
std::string res;
format_args(res, "res is arg1 = %d, arg2 = %s", arg1, arg2.c_str());
puts(res.c_str());
return 0;
}
写博客发现个markdown的用法, 对标题符合#转: #