【问题标题】:Parentheses and macro overloading in C++C++ 中的括号和宏重载
【发布时间】:2015-06-08 06:48:29
【问题描述】:

我的代码库已有一个宏:

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

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

【问题讨论】:

  • 不能“重载”宏,这是不可能的。

标签: c++ macros


【解决方案1】:

宏重载是不可能的。
在您的情况下,因为一旦定义了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>)

请记住,上面传递的参数将与任何地方一样。

【讨论】:

  • @iammilind 我更新了问题,详细说明了呼叫站点的外观。由于我希望原始呼叫站点也可以工作,我们不能取消定义 SOME_MACRO 可以吗?
  • @theraju,不幸的是你问的是宏的重载,这是不可能的。您必须在其中任何一个之间做出选择。
猜你喜欢
  • 2021-07-22
  • 2012-06-04
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
相关资源
最近更新 更多