Я работаю над проектом обратной совместимости и поэтому мне нужно переопределить вещи, не связываясь со старым кодом. Я хочу использовать вывод в качестве одного из параметров в #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 должен быть выходным …
На самом деле, нет. Для макроса нет такого понятия, как «вывод». В этом конкретном случае OPERATION(y)
это макрос, который расширяется до выражения. Это выражение впоследствии присваивается x
,
Но препроцессор обрабатывает только макрос, а не присваивание. Он не знает или не заботится о предыдущем токене. Компилятор видит только присваивание и выражения с обеих сторон, но не макрос. Ни один не имеет полной картины.
В 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
в макрос в качестве параметра. Поочередно отредактируйте свой вопрос с реальной проблемой, которую вы пытаетесь решить.
Если я вас правильно понимаю, то 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
,