【发布时间】:2011-04-06 12:37:24
【问题描述】:
在 C++ 中, 我需要定义一个宏。 该宏会将代码“块”作为参数。
我们可以安全地使用几行代码作为宏函数的参数吗?
我问自己是否:
- 以下代码是否有效,被标准定义为有效,如“跨平台”中的?
- 有没有更好的方法来做同样的事情(我不能在那里使用模板函数,因为我需要上下文)。
#define MY_MACRO( expr ) DOSOMETHING( (expr) ); DOANOTHERTHING( (expr) ); // etc...
int my_function() {
int o = RandomNumber();
MY_MACRO(
int k = AFunction();
k++;
AnotherFunction( k + o ); // here I need to keep the context of the call
);
}
我们不能使用仿函数,因为我们需要访问调用的上下文。 我们不能使用 lambda (snif),因为我们使用的是不提供它的旧编译器(而且我们无法更改它)。
【问题讨论】:
-
这个宏有什么用?
-
你试过了吗?发生了什么 ?我的猜测是,您传递的每个表达式“参数”都需要包含在
()中。 -
感谢 Paul 的编辑,找不到正确显示的方法。 @CharlesB:它生成的代码在生成的代码的几个部分中插入表达式参数。问题更多地与:我们可以安全地使用几行代码作为宏函数的参数吗?
-
@Paul R:我们现在正在尝试,但问题更多的是它是否由标准定义(使用多行宏)以及它是否是跨平台的。
-
@Klaim,如果您解释 context 是什么意思,也许它可能有助于回答。例如,您是否需要
DOSOMETHING和DOANOTHERTHING中调用者的所有状态?如果没有,你能不能把你需要的东西封装在一个你可以传递给这些的函子中?