2

我正在开发一个向后兼容的项目,因此,我需要重新定义事物而不会弄乱旧代码。我想将输出用作 a 中的参数之一#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__)

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

是否可以 ?如果是这样,如何?如果没有,这种情况有解决方案吗?我有具有 OPERATION(y) 的旧代码的音调,并希望将其重新定向到 OPERATION_NEW(y,x) -同时记住 x 必须是输出...

4

3 回答 3

2

并不真地。宏没有“输出”之类的东西。在这种特殊情况下,OPERATION(y)是一个扩展为表达式的宏。该表达式随后被分配给x

但是预处理器只处理宏,而不是赋值。它不知道也不关心之前的令牌。编译器只看到两边的赋值和表达式,而不是宏。两者都没有完整的画面。

于 2012-09-13T14:14:26.060 回答
0

如果我理解正确,则xin 的参数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.

于 2012-09-13T14:05:09.000 回答
0

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

但如果我理解正确,假设我们有:

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

因此,您只需将其更改为:

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

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

于 2012-09-13T14:31:41.720 回答