2

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

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

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

首先,我认为有某种宏重载,我可以很容易地做到这一点,但事实证明,如果我编写另一个具有相同名称但参数数量不同的宏,它将无法编译。所以为了让它工作,我应该让每个宏名称都是唯一的。

那么有什么聪明的方法可以做到这一点吗?

提前谢谢你。

4

2 回答 2

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__ )
于 2012-10-10T11:26:49.463 回答
2

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

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

#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");
于 2012-10-10T11:26:35.877 回答