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于文字数字。我希望能够传入一个扩展为数字的宏变量。如何在将 C 预处理器bit连接到之前扩展它b

4

2 回答 2

3

诀窍是 C 预处理器仅在宏参数未与字符串化 ( #) 或标记粘贴 ( ##) 运算符一起使用时才会展开宏参数。因此,要使其与扩展为数字文字的宏一起使用,请添加一个额外的宏层,如下所示:

#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 回答