【问题标题】:How does a C-style struct with a bitfield get represented in a Rust #[repr(C)] struct?带有位域的 C 风格结构如何在 Rust #[repr(C)] 结构中表示?
【发布时间】:2017-07-21 04:48:11
【问题描述】:

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

【问题讨论】:

  • 我认为 bool 是 1 字节而不是 1 位。
  • 你看this crate了吗?
  • flag_aflag_b 将如何表示? 仅在 C 语言中没有标准的位字段表示方式,更不用说标准的跨语言表示了。如果您完全关心可移植性 - 即使在完全相同的系统上的不同编译器之间 - 你不要使用位字段。
  • @AndrewHenle - 我对位域了解不多,我正在尝试与使用它们的现有代码(nginx 内部)进行互操作。谢谢。

标签: c struct rust bit-fields


【解决方案1】:

不,你不能。

an open issue 关于支持位域,这似乎并不活跃。在问题中,@retep998 explains how bitfields are handled in winapi。如果您需要在 C 接口中处理位域,这可能会有所帮助。

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

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

【讨论】:

    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多