我正在尝试在 Rust 中为 FFI 重新创建一个混合位域成员和“普通”成员的 C 结构。
我已经读到bitflags crate将是一个可以使用的,不幸的是我发现文档缺乏关于语法实际如何工作的文档。
bitflags crate 可以更轻松地创建与 C 中使用枚举类似的样式的位掩码。位域板条箱声称创建可以访问的位域,但是我不知道它是如何工作的。
我有一个这样的C结构:
struct mixed {
unsigned int flag_1_1 : 1;
unsigned int flag_2_7 : 7;
unsigned int flag_3_8 : 8;
unsigned int some_val1;
unsigned int some_val2;
unsigned int flag_4_16 : 16;
};
我不知道如何在 Rust 中表示它,我会使用 crate libc来访问c_uint
,但除此之外,我目前几乎没有想法,并且找到其他未证明成功的代码:
#[repr(transparent)] // do I also need repr(C) ?
struct mixed {
flags_1_3: mixed_flags_1_3;
some_val1: c_uint;
some_val2: c_uint;
flags_4: mixed_flags_4;
}
bitfield!(
#[repr(transparent)] // do I also need repr(C), here too?
struct mixed_flags_1_3(u16 /* what about this parameter? */) {
u8; // what does this mean?
/* get/field, set: first bit, last bit; */
flag_1_1, _: 0, 0;
flag_2_7, _: 7, 1;
flag_3_8, _: 15, 8;
}
)
bitfield!(
#[repr(transparent)]
struct mixed_flags_4(u8) {
u8;
flag_4_16, _: 15, 0;
}
)
这些只是猜测,如何创建正确的表示?