gpt4 book ai didi

c - 函数调用的宏赋值

转载 作者:太空宇宙 更新时间:2023-11-04 01:11:40 25 4
gpt4 key购买 nike

是否可以定义宏 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 是文字数字时有效。我希望能够传入一个扩展为数字的宏变量。在将它连接到 b 之前,如何让 C 预处理器扩展 bit

最佳答案

诀窍是 C 预处理器将扩展宏参数只有当它们没有被用于字符串化(#)或标记粘贴(##) 运营商。因此,要使其与扩展为数字文字的宏一起使用,请添加一个额外的宏层,如下所示:

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

根据这个定义,bit 不再是标记粘贴运算符的直接参数,因此如果它是一个宏,它会在标记粘贴之前展开。

关于c - 函数调用的宏赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11279175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com