可以定义宏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连接到b之前使C预处理器扩展它
发布于 2012-07-01 10:48:03
您可以使用额外的扩展步骤,如下所示:
#define BITATTR(num) b##num
#define BREF(var,bit) (((struct bits *) &(var))->BITATTR(bit))发布于 2012-07-01 10:47:10
诀窍在于,C预处理器仅在宏参数未与stringizing (#)或token-pasting (##)操作符一起使用时才会展开宏参数。因此,要使其与扩展为数字文字的宏一起使用,请添加额外的宏层,如下所示:
#define CONCAT(x, y) x ## y
#define BREF(var,bit) (((struct bits *) &(var))-> CONCAT(b, bit))有了这个定义,bit不再是标记粘贴操作符的直接参数,所以如果它是一个宏,它将在标记粘贴之前扩展。
https://stackoverflow.com/questions/11279175
复制相似问题