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