C++ 中的括号和宏重载
Parentheses and macro overloading in C++
我的代码库有一个现有的宏:
#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>)
请记住,上面传递的参数将随处可见。
我的代码库有一个现有的宏:
#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>)
请记住,上面传递的参数将随处可见。