我应该使用libc :: c_char还是std :: os :: raw :: c_char?

时间:2017-06-08 13:01:35

标签: rust ffi

我正在为Rust写一个FFI包装器。我见过libc::c_charstd::os::raw::c_char的用法。我对C的了解很少,我想知道是否有任何区别。如果我想通过cffi将字符串暴露给Python,我该怎么用?

2 个答案:

答案 0 :(得分:6)

我无法回答哪个更惯用,但我可以说它们在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变体,只是为了始终如一。

答案 1 :(得分:6)

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

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

  

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

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