0

私はマクロについて少しgnuオンラインドキュメントを読み、この文について少し混乱しました:

また、+=などの複数文字の演算子はトークンの貼り付けによって形成できます

それで、マクロが複合割り当てを実行できるかどうか迷います、どうやって?

4

3 に答える 3

1
#define PASTE(a,b) a##b
int foo;
foo PASTE(+,=) 2;

これが役立つのを私が見たのは、バイトコードインタープリターの内部ループだけでした。これは、各アームに非常に反復的なコードがある巨大なcaseステートメントのように見える傾向があります。

case OP_add: {
    if (sp < 2) goto underflow;
    double x = stack[--sp];
    stack[sp-1] += x;
} break;

サポートされているバイナリ算術演算子ごとに繰り返します。トークン貼り付け機能を使用すると、マクロからすべてを生成できます。

#define ARITH_BINOP(name, oper) case OP_##name: { \
    if (sp < 2) goto underflow; \
    double x = stack[--sp]; \
    stack[sp-1] oper##= x; \
} break /* deliberate absence of semicolon */

そして、スイッチで、あなたはただ書くことができます

ARITH_BINOP(add, +);
ARITH_BINOP(sub, -);
ARITH_BINOP(mul, *);
/* etc */
于 2013-01-21T14:53:33.370 に答える
0

私は、ドキュメントは次のようなケースについて述べていると思います:

#define COMPST(x, y) x ## y

int 
foo(int x)
{
  return x COMPST(+, =) 2;
}
于 2013-01-21T14:53:58.697 に答える
0

もちろん、マクロはCコードで達成できることなら何でも実行できます。

#define INCREMENT(x) ((x) += 1)

main() {
   int n=42;
   INCREMENT(n);
}

あなたが読んだ行は、あなたが興味を持っていないのではないかと私が思う別のことを意味します...

于 2013-01-21T14:54:37.737 に答える