C在宏中粘贴标记以处理C中的位字段

C在宏中粘贴标记以处理C中的位字段,c,macros,token,C,Macros,Token,我正在寻找访问位字段的基础上的数字是传递给宏作为参数。当我使用下面的代码时,我得到了错误。有办法解决这个问题吗? “错误:请求非结构或联合中的成员'biti'” struct { int比特0:1; int比特1:1; int比特2:1; int bit3:1; int bit4:1; int bit5:1; int bit6:1; int bit7:1; }a_型; a_b型; #定义get_bit_值(x)b.bit#x 对于(i=0;i 有办法解决这个问题吗 我不担心,但是你能用数组来代替

我正在寻找访问位字段的基础上的数字是传递给宏作为参数。当我使用下面的代码时,我得到了错误。有办法解决这个问题吗? “错误:请求非结构或联合中的成员'biti'”

struct
{
int比特0:1;
int比特1:1;
int比特2:1;
int bit3:1;
int bit4:1;
int bit5:1;
int bit6:1;
int bit7:1;
}a_型;
a_b型;
#定义get_bit_值(x)b.bit#x
对于(i=0;i
有办法解决这个问题吗

我不担心,但是你能用数组来代替,像这样的东西吗

int type[8] = {1,1,1,1,1,1,1,1};

#define get_bit_value(x) type[x]

for(int i=0; i<8 ;i++)
{
 int temp;
 temp = get_bit_value(i);
 ...
}
int-type[8]={1,1,1,1,1,1};
#定义获取位值(x)类型[x]

对于(int i=0;i而言,问题在于变量
i
在运行时只有一个值。在解析过程中(当计算宏时),
i
只是一个标记。编译器甚至不知道
i
是一个变量,更不用说是一个介于0和7之间的整数了

另一种方法是查看编译器的功能,以及预处理期间代码的外观:

for(i=0; i<=7 ;i++)
{
  int temp;
  temp = b.bit##i;
  ...
}

对于(i=0;i你必须改变方法

 #define get_bit_value(b, x)  (((b)&(1 << (x)))!=0)

 #define set_bit_value(b, x)  ((b)|=(1 << (x)))

 uint8_t v = 0;

 set_bit_value(v, 5);

#定义获取位值(b,x)((b)和(1您需要一个更复杂的宏,它不能基于粘贴。它必须基于选择:

#define get_bit_value(i) ((i) < 4                              \
                          ? ((i) < 2                           \
                             ? ((i) < 1 ? b.bit0 : b.bit1)     \
                             : ((i) < 3 ? b.bit2 : b.bit3))    \
                          : ((i) < 6                           \
                             ? ((i) < 5 ? b.bit4 : b.bit5)     \
                             : ((i) < 7 ? b.bit6 : b.bit7)))

谢谢..但是当处理大量的结构和64位整数时,这不是在消耗内存吗?所以,我在寻找上面的实现。还有另一种方法,我想使用位操作,比如(a&(1@user2218872位操作通常是位字段代码被转换成的内容;您只是自动生成
>
&
#define get_bit_value(i) ((i) < 4                              \
                          ? ((i) < 2                           \
                             ? ((i) < 1 ? b.bit0 : b.bit1)     \
                             : ((i) < 3 ? b.bit2 : b.bit3))    \
                          : ((i) < 6                           \
                             ? ((i) < 5 ? b.bit4 : b.bit5)     \
                             : ((i) < 7 ? b.bit6 : b.bit7)))
inline int get_bit_value (int i) {
    switch (i) {
    case 0: return b.bit0;
    case 1: return b.bit1;
    case 2: return b.bit2;
    case 3: return b.bit3;
    case 4: return b.bit4;
    case 5: return b.bit5;
    case 6: return b.bit6;
    case 7: return b.bit7;
    default: assert(0 <= i && i < 8);
    }
}