有offsetof
宏和sizeof
操作符用于结构和类。
有没有办法让bit字段有类似的功能,可以查询bit字段成员的bit offset和bit size?sizeof
可以用#define field_name_size n
来模拟,但是对于offsetof
,我担心使用#define field_name_offset
会变得太麻烦,因为这样的话,似乎必须使用一些复杂的公式来考虑位字段中所有前面的成员。
在某些情况下,它将使人们能够克服手动保持代码与位字段定义同步的需要,这是容易失败的。
一个例子是互锁写入位字段的成员,其中需要使用自定义函数来写入这些成员,因为编译器不提供这样的功能。
另外,我知道编译器可能会以不同的方式实现位字段的布局。这样的宏/操作符的可用性也会减少这个问题的影响。
3条答案
按热度按时间jgwigjjp1#
有没有办法为位字段获得类似的功能,以便可以查询位字段成员的位偏移量和位大小?
不,没有办法实现这一点。不能从位域成员推导出位大小偏移量。
sizeof()
也将始终返回底层类型的大小,最小值为char
,因此1是您将检索的最小大小。olmpazwi2#
不,没有,这也是你应该避免使用位域的原因之一,你应该使用自己的位数组,类似的,使用算术和完整的,可寻址的整数类型。
jtw3ybtb3#
@维克托苏亚雷斯已经创建了一个甜蜜的constexpr solution prototype,他创建了一个类型和一个长长的联合,然后操纵位域并在长长中搜索效果。他的草案是不完整的,例如,它应该使用一些u8[sizeof(T)]而不是一个长的长,应该在那里搜索操纵的位,但它显示:这是可能的,它基本上可以工作/将工作。
唉,我现在没有机会创建一个完整的可移植解决方案,但我想指出一个解决方案的方法。