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

写交易所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 简单日志

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值