2

私は下位互換性プロジェクトに取り組んでいるので、古いコードをいじることなく物事を再定義する必要があります。出力をのパラメータの1つとして使用したいと思います#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

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 に答える
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

于 2012-09-13T14:05:09.000 に答える