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