3

2 つの数値と演算子を渡すことができるマクロを定義しようとしています。マクロが 2 つの数値に対して指定された演算を実行し、結果を返すようにします。

私の定義は次のとおりです。

#define GENERAL_OP(x,y,op) ((x) op (y))

私が呼び出すと正常に動作します

int result = GENERAL_OP(1, 2, -);

しかし、次の例のように、文字を渡そうとするとすぐに (これは、マクロを呼び出す一般化された関数で実際に行う必要があることです)。

void Evaluate(char op)...

int result = GENERAL_OP(1, 2, op);
4

3 に答える 3

9
void Evaluate(char op)...

int result = GENERAL_OP(1, 2, op);

マクロ置換はコンパイル前に行われますが、 の引数はEvaluate実行時にしか利用できないため、マクロ展開は次のようになります。

int result = ((1) op (2));

あり、そこにop表示されるトークンではありません (おそらく宣言されていない識別子)。

于 2012-10-25T15:08:40.593 に答える
0

私はあなたが何をしようとしているのかわかります...それは文字列を解こうとしているようなものです。私はそれがあなたが望むように働くことができないとかなり確信しています。あなたの最善の策は、次のようなことをすることです。

void Evaluate(char op, int x, int y)
{
    int result;
    if(op == '-')
      GENERAL_OP(x, y, -);
    ...

しかし、それはそれを非常に「一般的」にするわけではありません...

于 2012-10-25T15:17:33.370 に答える
0

opプリプロセッサはコンパイル時に動作します。マクロ内で の値を使用することはできません。

于 2012-10-25T15:10:07.397 に答える