c++宏代码调用不定参数

    技术2022-07-11  156

    写交易所CTP代码发现里面有一个宏LOG,接收不定参数并将之打印.而平时自己的代码是用log4cplus写的,准备将LOG通过底层处理交由log4cplus接管.

    原始的LOG定义比较简单:

    #define LOG(format, ...) fprintf(logfile, format, __VA_ARGS__); printf(format, __VA_ARGS__); fflush(logfile);

    在外部定义一个文件,然后支持不定参数,将之打印到文件中完事.

    如果需要将之交由log4cplus执行的话,意味着需要先将不定参数解决,然后log4cplus才能处理.

    先设计一个全局函数,将不定参数转成str

    std::string LogWrite(const char *format, ...) { va_list pArgs; va_start(pArgs, format); size_t nLength = vsnprintf(NULL, 0, format, pArgs) + 1; va_end(pArgs); char * p = NULL; char buf[2048] = { 0 }; if (nLength > sizeof(buf)) { char * new_buf = new char[nLength]; memset(new_buf, 0, nLength); p = new_buf; } else { memset(buf, 0, sizeof(buf)); p = buf; } va_list plist; va_start(plist, format); vsnprintf(p, nLength, format, plist); va_end(plist); std::string str = p; if (nLength > sizeof(buf)) delete[]p; return str; }

    然后设计一个宏函数:此函数接口为不定参数,然后通过调用不定参数LogWrite得到转换的str,并调用LOG_INFO将str交由log4cplus去执行.

    #define WRITE_LOG(FMT, ...)\ {\ std::string str = LogWrite(FMT, ##__VA_ARGS__);\ LOG_INFO(str);\ }

    最后设计用户接口LOG

    # define LOG(FMT, ...) WRITE_LOG(FMT, ##__VA_ARGS__)

    功能完成.此设计在vs2015, linux gcc4.8.5均编译通过.

     

    参考:

    https://www.cnblogs.com/wjshan0808/p/8409773.html, 这儿宏调试日志有所启发

    https://gitee.com/sollyu/EasyLog/blob/master/EasyLog.h 简单日志

    Processed: 0.016, SQL: 9