繁体   English   中英

参数数目可变的宏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM