声明外部函数以及变量
使用 extern
可以声明函数及变量, 它们定义在其它库中. 在编译期间由链接器(linker) 将 rust 代码
与它们这些库链接起来.
这些库可以是静态库, 或者动态库.
举个例子, 声明C库中的 strlen
, 最终会与 libc.so
或者 libc.a
链接:
#![allow(unused)] fn main() { use std::os::raw::c_char; extern { fn strlen(s: *const c_char) -> usize; } extern "C" { fn strerror(error_num: i32) -> *const c_char; } }
这里, rust 默认 extern
代码块使用的是 C 语言的转换方式, 所以 extern "C"
可以简写为 extern
.
如果是外部变量的话, 也是类似做法, 比如 environ
保存着进程当前的环境变量列表:
use std::ffi::{c_char, CStr}; extern "C" { static mut environ: *const *const c_char; } pub fn print_env() { unsafe { let mut env = environ; if !env.is_null() { while !(*env).is_null() { let entry = CStr::from_ptr(*env); println!("env: {}", entry.to_string_lossy()); env = env.add(1); } } } } fn main() { print_env(); }