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

问题描述 投票:0回答:2

我有一个 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
s吗?或者整个事情是否需要是某种具有单个字段的位集,然后我将它们屏蔽掉?

例如

pub flag_bits: ::libc::c_uint,

c struct rust bit-fields
2个回答
9
投票

不,你不能。

有关于支持位字段的一个未解决的问题,该问题似乎并不活跃。在本期中,@retep998 解释了如何在

winapi
中处理位域。如果您需要在 C 接口中处理位域,这可能会有所帮助。

OP 似乎旨在实现 C 互操作,但如果您只需要位域功能,有多种解决方案。

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

0
投票

现在可以通过 bitfield_struct crate 获得。

https://docs.rs/bitfield-struct/latest/bitfield_struct/

© www.soinside.com 2019 - 2024. All rights reserved.