C++ 中的不定参数与格式化字符串 # ## vsprintf

日志打印或者格式字符串时,可能会用到不定参数的使用,这里记录一下。
格式化字符串有很多方法:

##是一个连接符号,用于把参数连在一起
#是“字符串化”的意思,出现在宏定义中的#是把跟在后面的参数转换成一个字符串
并且# ##都只能出现在宏定义中

include <stdio.h>

#define test(n) printf("arg" #n " = %d\n", 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的用法, 对标题符合#转: \#

posted on 2018-08-09 08:47  旭东的博客  阅读(1181)  评论(0编辑  收藏  举报

导航