有时你的 Rust 代码可能需要与其他语言编写的代码交互。为此 Rust 有一个关键字,extern,有助于创
建和使用 外部函数接口(Foreign Function Interface,FFI)。外部函数接口是一个编程语言用以定义函
数的方式,其允许不同(外部)编程语言调用这些函数。
示例 19-8 展示了如何集成 C 标准库中的 abs 函数。extern 块中声明的函数在 Rust 代码中总是不安全
的。因为其他语言不会强制执行 Rust 的规则且 Rust 无法检查它们,所以确保其安全是程序员的责任:
文件名: src∕main.rs
extern “C” {
fn abs(input: i32) -> i32;
}
fn main() {
unsafe {
println!(“Absolute value of -3 according to C: {}”, abs(-3));
}
}
示例 19-8: 声明并调用另一个语言中定义的 extern 函数
在 extern ”C” 块中,列出了我们希望能够调用的另一个语言中的外部函数的签名和名称。”C” 部分定义
了外部函数所使用的 应用二进制接口(application binary interface,ABI)—— ABI 定义了如何在汇编
语言层面调用此函数。”C” ABI 是最常见的,并遵循 C 编程语言的 ABI。
从其它语言调用 Rust 函数
也可以使用 extern 来创建一个允许其他语言调用 Rust 函数的接口。不同于 extern 块,就在 fn 关
键字之前增加 extern 关键字并指定所用到的 ABI。还需增加 #[no_mangle] 注解来告诉 Rust 编译
器不要 mangle 此函数的名称。Mangling 发生于当编译器将我们指定的函数名修改为不同的名称
时,这会增加用于其他编译过程的额外信息,不过会使其名称更难以阅读。每一个编程语言的编译
器都会以稍微不同的方式 mangle 函数名,所以为了使 Rust 函数能在其他语言中指定,必须禁用
Rust 编译器的 name mangling。
在如下的例子中,一旦其编译为动态库并从 C 语言中链接,call_from_c 函数就能够在 C 代码中访
问:
#[no_mangle]
pub extern “C” fn call_from_c() {
println!(“Just called a Rust function from C!”);
}
extern 的使用无需 unsafe。
Rust从入门到实战系列二百二十三:使用 extern 函数调用外部代码
最新推荐文章于 2024-04-25 19:17:25 发布