具有可变数量参数的宏

时间:2012-10-10 11:17:21

标签: c++ macros

我一直在开发使用日志记录机制的应用程序,我实现了一些printf函数,它接受各种参数和打印来记录某些消息,我想要的是为这个函数添加一个函数名,但我不在每个函数调用中写这个参数的内容。

所以我决定编写一个宏,结果并不那么容易

#define WriteToLogParams(szMessage, nLogLevel, param1, param2) WriteToLogParamsFunc(szMessage, __FUNCDNAME__, nLogLevel, param1, param2)

首先我认为存在某种宏重载并且我可以很容易地做到,但是如果我编写另一个具有相同名称但具有不同编号的参数数量的宏,那么事实证明。因此,为了使其工作,我应该使每个宏名称都是唯一的。

有没有明智的方法可以做到这一点?

先谢谢你。

2 个答案:

答案 0 :(得分:3)

您可以使用__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__ )

答案 1 :(得分:2)

我相信有一些预处理器支持variadic macros,但我不确定它是否是标准,并且肯定是不支持它的编译器因此它不可移植。

但是,不要尝试使用可变数量的参数,而只需要一个参数。这就是我所做的: -

#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");