原创: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字符串】是以