首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数调用的宏赋值

函数调用的宏赋值
EN

Stack Overflow用户
提问于 2012-07-01 10:39:18
回答 2查看 1.9K关注 0票数 1

可以定义宏BREF(...):

代码语言:javascript
复制
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;

这样这句话:

代码语言:javascript
复制
ALIAS = 1;

扩展到以下内容:

代码语言:javascript
复制
((struct bits *)&foo)->b4 = 1;

还有这个:

代码语言:javascript
复制
int k = ALIAS;

要这样做:

代码语言:javascript
复制
int k = ((struct bits *)&foo)->b4;

到目前为止,这是我的BREF(...)实现:

代码语言:javascript
复制
#define BREF(var,bit) (((struct bits *) &(var))->b##bit)

但是,只有当bit是文字数字时,这才有效。我希望能够传入一个扩展为数字的宏变量。如何在将bit连接到b之前使C预处理器扩展它

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-01 10:48:03

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

代码语言:javascript
复制
#define BITATTR(num) b##num
#define BREF(var,bit) (((struct bits *) &(var))->BITATTR(bit))
票数 2
EN

Stack Overflow用户

发布于 2012-07-01 10:47:10

诀窍在于,C预处理器仅在宏参数未与stringizing (#)或token-pasting (##)操作符一起使用时才会展开宏参数。因此,要使其与扩展为数字文字的宏一起使用,请添加额外的宏层,如下所示:

代码语言:javascript
复制
#define CONCAT(x, y) x ## y
#define BREF(var,bit) (((struct bits *) &(var))-> CONCAT(b, bit))

有了这个定义,bit不再是标记粘贴操作符的直接参数,所以如果它是一个宏,它将在标记粘贴之前扩展。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11279175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档