Rust

43 文章

FFI:让 C 调用 Rust

3 分钟

让 C 调用 Rust,不是把 Rust 函数原样暴露给 C。

C 能理解的是 C ABI:符号名、调用约定、整数、指针、结构体布局、谁分配内存、谁释放内存、错误怎么返回。Rust 内部的 String、Vec、Result、trait、panic,都不应该直接跨过 C 边界。

阅读更多

unsafe:把 C 风险限制在边界

3 分钟

C 开发者第一次看到 unsafe,很容易把它理解成“Rust 里可以写 C 的地方”。

这个理解太粗。

unsafe 不是关闭 Rust 所有检查,也不是把整段代码变回 C。它只允许你做少数编译器无法静态证明安全的操作,例如解引用裸指针、调用 FFI 函数、访问可变全局变量。

阅读更多

枚举和联合体

4 分钟

C 里 enum 和 union 经常一起出现。enum 表示当前是哪种类型,union 复用同一块内存保存不同数据:

enum ValueKind {
    VALUE_INT,
    VALUE_FLOAT,
    VALUE_TEXT,
};

struct Value {
    enum ValueKind kind;
    union {
        int i;
        float f;
        const char *text;
    } data;
};

这是 C 里的 tagged union。它很常见,也很有用,但正确性靠纪律:

阅读更多

借用:引用不是普通指针

4 分钟

上一篇讲所有权:谁拥有,谁释放。

但大多数函数并不想接管资源。它只是想临时看一眼数据,或者临时改一下数据。C 里通常传指针:

void inspect(const uint8_t *buf, size_t len);
void update(uint8_t *buf, size_t len);

Rust 里对应的是借用:

fn inspect(buf: &[u8]) {}
fn update(buf: &mut [u8]) {}

借用的核心不是“Rust 指针语法”,而是访问权限:不拿走所有权,只临时读或写。

阅读更多

所有权:谁拥有,谁释放

4 分钟

C 代码里早就有所有权。

只要一段内存需要 free,一个文件需要 fclose,一个句柄需要释放,就一定存在一个问题:谁负责最后把它释放掉。

C 的问题不是没有所有权,而是所有权通常不在类型里。它靠函数名、注释、调用约定和团队经验维护。Rust 的 ownership 做的事,就是把这些约定变成编译器能检查的规则。

阅读更多