1

マクロ BREF(...) を定義することが可能です:

struct bits
{
    int b0:1;
    int b1:1;
    int b2:1;
    int b3:1;
    int b4:1;
    int b5:1;
    int b6:1;
    int b7:1;
}

#define BREF(var,bit) ????
#define BAR 4
#define ALIAS BREF(foo,BAR)

unsigned char foo;

このステートメントのように:

ALIAS = 1;

これに展開します:

((struct bits *)&foo)->b4 = 1;

この:

int k = ALIAS;

これに:

int k = ((struct bits *)&foo)->b4;

これまでのところ、これは BREF(...) の私の実装です:

#define BREF(var,bit) (((struct bits *) &(var))->b##bit)

ただし、これbitは がリテラル数字の場合にのみ機能します。数値に展開されるマクロ変数を渡すことができるようにしたいと考えています。bitに連結する前にC プリプロセッサを展開するにはどうすればよいbですか?

4

2 に答える 2

3

秘訣は、C プリプロセッサがマクロ引数を展開するのは、マクロ引数が stringizing( ) または token-pasting( ) 演算子で使用されていない場合のみです###。したがって、数値リテラルに展開されるマクロで機能させるには、次のようにマクロのレイヤーを追加します。

#define CONCAT(x, y) x ## y
#define BREF(var,bit) (((struct bits *) &(var))-> CONCAT(b, bit))

この定義によりbit、トークン貼り付け演算子の直接の引数ではなくなるため、マクロの場合、トークン貼り付けの前に展開されます。

于 2012-07-01T02:47:10.023 に答える
2

次のように、拡張の追加ステップを使用できます。

#define BITATTR(num) b##num
#define BREF(var,bit) (((struct bits *) &(var))->BITATTR(bit))
于 2012-07-01T02:48:03.293 に答える