带位域​​的 C 风格结构如何在 Rust #[repr(C)] 结构中表示?

How does a C-style struct with a bitfield get represented in a Rust #[repr(C)] struct?

我有一个 C 结构定义为:

struct my_c_s {
    u_char          *ptr;
    unsigned        flag_a:1;
    unsigned        flag_b:1;
    int             some_num;
}

如何表示 flag_aflag_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,
}

我可以将它们声明为 bools 吗? 或者整个事情是否需要是某种具有单个字段的位集,然后我进行位掩码他们出去了?

例如pub flag_bits: ::libc::c_uint,

不,你不能。

an open issue about supporting bitfields, which doesn't seem to be active. In the issue, @retep998 explains how bitfields are handled in winapi个。如果您需要在 C 接口中处理位域,这可能会有所帮助。

OP似乎是针对C互操作的,但如果你只需要位域功能,有几种解决方案。

  • 您应该始终考虑简单的冗余解决方案:避免使用位域并让字段自然对齐。
  • bitfield, according to -- 我不知道,但它似乎提供了等效的 C 位域。
  • bitflags。这似乎适用于基于位的标志,在 C 中通常表示为 enum
  • #[repr(packed)] 如果您只想在某种程度上打包字段,而忽略对齐。这些字段仍将与字节边界对齐。
  • bit-vec 如果您需要同质位数组。