函数调用的宏分配

时间:2012-07-01 02:39:18

标签: c macros struct bit-manipulation

可以定义宏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

2 个答案:

答案 0 :(得分:3)

诀窍是C预处理器只有在它们不与字符串化(#)或令牌粘贴(##)运算符一起使用时才会扩展宏参数 。因此,为了使其适用于扩展为数字文字的宏,请添加一个额外的宏层,如下所示:

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

使用此定义,bit不再是令牌粘贴运算符的直接参数,因此如果它是宏,则会在令牌粘贴之前展开。

答案 1 :(得分:2)

您可以使用额外的扩展步骤,如下所示:

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