原创:FFI极简应用场景【字符串·传输】浅谈
导言
这篇文章分享了我对Rust与C程序之间字符串(字节序列)传输机制的“悟道”成果。【FFI字符串·传输】是FFI诸多概念中:
- 最简单的里最难的 — 对比·各种整数类
- 最难的里最简单的 — 对照·样式繁多的自定义数据结构
它算是难度适中,既能讲出点内容来,又不会知识点太过生涩劝退读者。上干货!
知识点“大图”
这还真是一张图。一图抵千词,再配上一些文字描述,应该能够把概念讲清楚。

首先,libc crate是操作系统常用ABI的FFI binding。
- 一方面,在
Cargo.toml中添加libc依赖项·就相当于·在C代码插入一行导入系统头文件的#include语句。 - 另一方面,
libc crate不是系统ABI的跨平台解决方案。所以,libc crate的下游使用者得自己区分在哪个操作系统平台上,调用libc crate的哪个API— 即便实现功能相同,在不同操作系统平台上,多半也得调用不同libc crate API。- 若你想同一套程序跨平台,还是老老实实地上【条件·编译】吧!
- 最后,
libc crate不是包罗万象的。你要知道操作系统ABI有多少,有多庞大。libc crate的绑定范围很窄,粗略包括- 在
-inux系统上,libc,libm,librt,libdl,libutil和libpthread - 在
OSX系统上,libsystem_c,libsystem_m,libsystem_pthread,libsystem_malloc和libdyld - 在
Windows系统上,CRT。若做win32开发,我还是比较推荐winapi crate。
- 在
其次,【Rust字符串】与【C字符串】指的是采用了不同【字节序列·编码格式】的字符串,而不是特指Rust内存里或C内存里的字符串。
- 【
Rust字符串】严格遵循UTF-8编码格式。它的长度信息被保存于- 要么,
String智能指针·结构体的私有字段self.vec.len内。 - 要么,
&str胖指针内。
- 要么,
- 【
C字符串】是以
