[英]macros with variable number of arguments
我一直在开发使用日志记录机制的应用程序,并且实现了带各种参数和打印以记录某些消息的printf函数,我想要的是在此函数中添加函数名称,但是我没有写什么每个函数调用中的此参数。
所以我决定写一个宏,结果并不容易
#define WriteToLogParams(szMessage, nLogLevel, param1, param2) WriteToLogParamsFunc(szMessage, __FUNCDNAME__, nLogLevel, param1, param2)
首先,我认为存在某种类型的宏重载并且可以轻松实现,但是事实证明,如果我编写另一个具有相同名称但参数数目不同的宏,则不会编译。 因此,要使其正常工作,我应该使每个宏名称唯一。
那么有什么聪明的方法可以做到这一点?
谢谢你提前。
您可以使用__VA_ARGS__
宏
例如:
WriteToLogParamsFunc(const char *__file, int __line, const char* __func, int nLogLevel, const char *szMessage, ...);
#define WriteToLogParams(nLogLevel, szMessage, ...) WriteToLogParamsFunc(__FILE__, __LINE__, __FUNCTION__, nLogLevel, szMessage, __VA_ARGS__ )
我相信有些预处理器支持可变参数宏,但是我不确定它是否是标准,并且肯定有不支持它的编译器,因此它不是可移植的。
但是,与其尝试使用可变数量的参数,不如仅使用一个参数。 这是我所做的:
#define WriteToLogParams(args) WriteToLogParamsObject::Instance (__FUNCDNAME__) << args
其中WriteToLogParamsObject是由静态成员Instance
创建的类,并且具有重载的流运算符。 这为您提供了使用这些运算符的优点,例如将流重载放入类中:
class SomeClass
{
static friend WriteToLogParamsObject &operator << (WriteToLogParamsObject &stream, const SomeClass &item_to_log)
{
stream << "member1 = " << item_to_log.m_member1 << ", member2 = " << item_to_log.m_member2;
// and so on (syntax might be off)
return stream;
}
};
并使用宏:
WriteToLogParams ("some message " << some_value << " another bit of text " << another_value << " and so on");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.