我有一个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,
}

我可以将它们声明为bool吗?还是整个事情需要是具有单个字段的某种类型的位集,然后我将它们位屏蔽掉?

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

最佳答案

不,你不能。

关于支持位域,存在an open issue,它似乎并不活跃。在本期中,@retep998 explains how bitfields are handled in winapi 。如果您需要在C接口(interface)中处理位字段,则可能会有所帮助。

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

  • 您应该始终考虑简单的冗余解决方案:避免位域并使字段自然对齐。
  • ,根据 bitfield -我不知道,但是它似乎提供了等效的C位域。
  • the comment。这似乎适用于基于位的标志,这些标志通常在C语言中表示为bitflags
  • enum(如果您只想在某种程度上打包字段,而忽略对齐)。这些字段仍将与字节边界对齐。
  • #[repr(packed)] 如果需要同构的位数组。
  • 关于c - 带位域​​的C样式结构如何在Rust#[repr(C)]结构中表示?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45229167/

    10-12 23:35