Могу ли я использовать вывод в качестве параметра в #define

Я работаю над проектом обратной совместимости и поэтому мне нужно переопределить вещи, не связываясь со старым кодом. Я хочу использовать вывод в качестве одного из параметров в #define,
Например: мой старый код содержит

#define OPERATION(y) ...

и мы использовали это

x = OPERATION(y);

в новом коде мы имеем:

#define OPERATION_NEW(y,x) ...

и мы используем это как:

x = OPERATION_NEW(y,x);

обратите внимание, что теперь х является результатом и параметром.

Я хочу быть в состоянии сделать следующее:

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

(Я хочу иметь возможность получить вывод в качестве параметра и использовать его в определении …)

Является ли это возможным ? и если да, то как? если нет, есть ли решение для этой ситуации? У меня есть тоны старого кода с OPERATION (y), и я хочу перенаправить его на OPERATION_NEW (y, x), учитывая, что x должен быть выходным …

2

Решение

На самом деле, нет. Для макроса нет такого понятия, как «вывод». В этом конкретном случае OPERATION(y) это макрос, который расширяется до выражения. Это выражение впоследствии присваивается x,

Но препроцессор обрабатывает только макрос, а не присваивание. Он не знает или не заботится о предыдущем токене. Компилятор видит только присваивание и выражения с обеих сторон, но не макрос. Ни один не имеет полной картины.

2

Другие решения

В x = 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 в макрос в качестве параметра. Поочередно отредактируйте свой вопрос с реальной проблемой, которую вы пытаетесь решить.

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,

0