C++ 参数数目可变的宏

C++ 参数数目可变的宏,c++,macros,C++,Macros,我一直在开发一个使用日志机制的应用程序,我实现了一种printf函数,它接受不同数量的参数并打印以记录特定的消息,我想要的是给这个函数添加一个函数名,但我不知道在每个函数调用中写什么 所以我决定写一个宏,结果却不那么容易 #define WriteToLogParams(szMessage, nLogLevel, param1, param2) WriteToLogParamsFunc(szMessage, __FUNCDNAME__, nLogLevel, param1, param2) 首

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

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

#define WriteToLogParams(szMessage, nLogLevel, param1, param2) WriteToLogParamsFunc(szMessage, __FUNCDNAME__, nLogLevel, param1, param2)
首先,我认为存在某种宏重载,我可以很容易地做到这一点,但是如果我用相同的名称编写另一个宏,但参数数量不同,它将无法编译。因此,为了使其工作,我应该使每个宏的名称都是唯一的

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


提前谢谢。

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

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

#define WriteToLogParams(args) WriteToLogParamsObject::Instance (__FUNCDNAME__) << args
要使用宏,请执行以下操作:-

WriteToLogParams ("some message " << some_value << " another bit of text " << another_value << " and so on");

WriteToLogParams(“一些消息”您可以使用
\uuu VA\u ARGS\uuu

例如:

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__ )

下面是关于gcc的
可变宏的文档。给出的示例只是实现了代码的模糊化。为什么这种模糊化被认为是可取的?解决方案是否应该包含更大的模糊化,或者仅仅是相同数量的模糊化,但以“智能方式”实现(这是什么)请把它像一个答案一样贴出来,这样我就可以接受它了)既然这是标记C++,使用<代码>…>代码>不是非常C++,特别是,你丢失了类型信息。我确信C++中的代码< >…<代码>在C++中是有用的,我不认为它是常见的,因为通常有更好的面向对象的方法来做。我不能合理地否决这个,因为它直接回答了OP的技术问题。有点像,如何使用
goto
实现循环?但是读者应该知道它是一种不安全的C技术,产生非常脆弱的和可能错误的使用代码,完全不必要的C++ 1用于向右的方向前进。不利的一面是,宏和
@chearsandhth都错过了抽象的机会。-阿尔夫:一定要发布一个解决你问题的答案,我会对什么是好的实践感兴趣。哦,我只是略读一下。我已经为社区尽了我的一份力,所以我不想再浪费时间了。相比之下,评论几乎不花时间:-)此外,我可能已经在其他一些SO答案以及Usenet上展示了这些技巧。谷歌吧@阿尔夫:嗯,事实上,我真的很想知道,因为我认为我的解决方案在复制STL的流式风格(即代码> CUT)时包含了OO(C++中的)。
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__ )