Rust从入门到实战系列二百二十三:使用 extern 函数调用外部代码

有时你的 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。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值