【问题标题】:Should I use libc::c_char or std::os::raw::c_char?我应该使用 libc::c_char 还是 std::os::raw::c_char?
【发布时间】:2017-06-08 13:01:35
【问题描述】:

我正在为 Rust 编写 FFI 包装器。我见过libc::c_charstd::os::raw::c_char 的用法。我对 C 的了解非常少,我想知道是否有任何区别。如果我想通过 cffi 向 Python 公开字符串,我应该使用什么?

【问题讨论】:

  • “我对 C 的了解非常少,我想知道是否有任何区别。”,为什么 C 应该关心这个?这是关于生锈的。这显然是描述同一件事。 C 中的char

标签: rust ffi


【解决方案1】:

我无法回答哪个更惯用,但我可以说它们在 64 位 Linux(大多数在线托管文档的默认平台)上是相同的:

std::os::raw::c_char:

type c_char = i8;

libc::c_char:

type c_char = i8;

跨不同平台进行更广泛的研究有点复杂。标准库tightly groups all the definitions for c_char,但libc groups them by platform。考虑到这种类型的基础性,我希望它们在所有平台上都是相同的。

实际上,这些定义都不太可能改变,因此可能没有任何稳定性差异。

我的意见是使用标准库版本中的那个,直到我需要使用 libc 中的特定内容,在这种情况下,我可能会将所有类型切换到 libc 变体,以保持一致。

【讨论】:

    【解决方案2】:

    除了@Shepmaster 的回答,我想强调libc 不依赖于std 的事实。

    因此,如果您不能使用std,则必须使用libc。 这种情况可以看here

    目前 libc 默认链接到标准库,但如果您想在 #![no_std] 情况或 crate 中使用 libc,您可以通过以下方式提出请求:

    [dependencies]
    libc = { version = "0.2", default-features = false }
    

    【讨论】:

      猜你喜欢
      • 2013-02-05
      • 1970-01-01
      • 2015-07-26
      • 2017-03-13
      • 2019-08-01
      • 1970-01-01
      • 2011-02-13
      • 2023-02-09
      • 1970-01-01
      相关资源
      最近更新 更多