C ++中的括号和宏重载

时间:2015-06-08 06:48:29

标签: c++ macros

我的代码库有一个现有的宏:

#define SOME_MACRO <macro definition>

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

#define SOME_MACRO(arg1) <macro definition>

我看到这个question地址从宏的多个参数版本中进行选择。但是,SOME_MACRO调用尚未具有parantheses。它用作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";

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

1 个答案:

答案 0 :(得分:2)

无法进行宏重载 在您的情况下,因为您在定义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>)

请记住,上面传递的参数将随处可见。