C在宏中粘贴标记以处理C中的位字段
我正在寻找访问位字段的基础上的数字是传递给宏作为参数。当我使用下面的代码时,我得到了错误。有办法解决这个问题吗? “错误:请求非结构或联合中的成员'biti'”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 有办法解决这个问题吗 我不担心,但是你能用数组来代替
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);
}
}