我可以在#define中将输出用作参数

时间:2012-09-13 13:58:52

标签: c++ c c-preprocessor

我正在开发一个向后兼容项目,因此,我需要重新定义一些东西而不会弄乱旧代码。我想将输出用作#define中的一个参数。 例如:我的旧代码包含

#define OPERATION(y) ...

我们用它了

x = OPERATION(y);

在我们的新代码中:

#define OPERATION_NEW(y,x) ... 

我们使用它:

x = OPERATION_NEW(y,x);

请注意,现在x是结果和参数。

我希望能够做到下一个:

#define OPERATION(y) OPERATION_NEW(y,__output__)

(我希望能够将输出作为参数获取并在定义中使用它...)

有可能吗?如果是的话,怎么样?如果没有,这种情况有解决方案吗?我有旧操作代码的音调(y),并希望将其重定向到OPERATION_NEW(y,x) - 同时请记住x必须是输出...

3 个答案:

答案 0 :(得分:2)

不是真的。对于宏来说,没有“输出”这样的东西。在这种特殊情况下,OPERATION(y)是一个扩展为表达式的宏。随后将该表达式分配给x

但预处理器只处理宏,而不是赋值。它不知道或不关心以前的标记。编译器只能看到两侧的赋值和表达式,而不是宏。两者都没有完整的图片。

答案 1 :(得分:0)

如果我理解正确,x中的OPERATION_NEW参数将分配给。但是,如果您还应该从宏“返回”它,则无法执行此操作,您必须使用函数:

template<class T, class U>
T operation_new(U y)
{
    T dummy;
    return OPERATION_NEW(y, dummy);
}

#define OPERATION(y) operation_new(y)

上面的解决方案是C ++,做纯C版基本相同,但你使用固定类型代替模板参数TU

答案 2 :(得分:0)

预处理器处理x = OPERATION(y,x); OPERATION并替换文本。然后x = <whatever was substituted>由编译器编译。第一步对赋值运算符左侧的参数 no knowledge

但如果我理解正确,那就说我们有:

#define OPERATION_NEW(y,x) do_foo(y, x);

所以你只需将其更改为:

#define OPERATION_NEW(y,x) x = do_foo(y, x);

而不是使用赋值,您将源/目标x作为参数传递给宏。或者用你想要解决的真正问题编辑你的问题。

相关问题