我的代码库已有一个宏:

#define SOME_MACRO <macro definition>


对于我要进行的某些更改,我想添加一个带有参数的宏的新版本。

#define SOME_MACRO(arg1) <macro definition>


我看到这个question解决了从宏的多个参数版本中选择的问题。但是,SOME_MACRO调用还没有括号。它用作SOME_MACRO,而不是SOME_MACRO()。有什么方法可以实现宏重载,例如SOME_MACRO调用SOME_MACRO()。我试过了:

#define SOME_MACRO SOME_MACRO()
#define SOME_MACRO(...) <macro definition using __VA_ARGS__>


但这只是给我一个宏重新定义错误。在呼叫站点上,这是当前的样子:

SOME_MACRO << "This is a test";


我想添加以下形式的新调用:

SOME_MACRO(foo) << "This is a test";


我希望两个调用都能正常工作,因为前者已经在代码库中。这些基本上是日志宏,它们创建暴露流的对象。销毁后,它们会写出流内容。

最佳答案

宏重载是不可能的。
对于您的情况,由于一旦定义了SOME_MACRO后就不再需要SOME_MACRO(...),则可以在预期的(头文件)中执行以下操作:

#undef SOME_MACRO  // hopefully it is not a standard macro!
#define SOME_MACRO(...) // use __VA_ARGS__


现在,您可以在代码中调用SOME_MACRO(x,y,z);即带有括号。

如果要保留代码中的SOME_MACRO,请执行以下操作:

#undef SOME_MACRO
#define SOME_MACRO SOME_MACRO_1(<pass arguments here itself>)


请记住,上面传递的参数将无处不在。

09-08 01:02