我正在开发一个向后兼容项目,因此,我需要重新定义一些东西而不会弄乱旧代码。我想将输出用作#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必须是输出...
答案 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版基本相同,但你使用固定类型代替模板参数T
和U
。
答案 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
作为参数传递给宏。或者用你想要解决的真正问题编辑你的问题。