我有一个C结构定义为:
struct my_c_s {
u_char *ptr;
unsigned flag_a:1;
unsigned flag_b:1;
int some_num;
}
flag_a
和flag_b
如何表示?#[repr(C)]
pub struct my_rust_s {
pub ptr: *const u_char,
//pub flag_a: ?,
//pub flag_b: ?,
pub some_num: ::libc::c_int,
}
我可以将它们声明为
bool
吗?还是整个事情需要是具有单个字段的某种类型的位集,然后我将它们位屏蔽掉?例如
pub flag_bits: ::libc::c_uint,
最佳答案
不,你不能。
关于支持位域,存在an open issue,它似乎并不活跃。在本期中,@retep998 explains how bitfields are handled in winapi
。如果您需要在C接口(interface)中处理位字段,则可能会有所帮助。
OP似乎针对C互操作,但是如果您只需要位域功能,则有几种解决方案。
bitfield
-我不知道,但是它似乎提供了等效的C位域。 bitflags
。enum
(如果您只想在某种程度上打包字段,而忽略对齐)。这些字段仍将与字节边界对齐。 #[repr(packed)]
如果需要同构的位数组。 关于c - 带位域的C样式结构如何在Rust#[repr(C)]结构中表示?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45229167/