面试题答案
一键面试定义可被C调用的Rust函数
在Rust中,使用extern "C"
块来定义可被C调用的函数。extern "C"
指定了使用C语言的调用约定,这样C代码就能正确调用Rust函数。
示例代码如下:
// 定义一个可被C调用的Rust函数
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
a + b
}
#[no_mangle]
注解用于防止Rust对函数名进行重整(name mangling),确保C代码能够按照预期的函数名找到该函数。
在Rust中调用C函数
- 创建C代码:
首先编写C函数,例如创建一个
add.c
文件:
int add(int a, int b) {
return a + b;
}
- 编译C代码为静态库:
在命令行中使用
gcc
编译成静态库,假设系统是Linux,命令如下:
gcc -c -o add.o add.c
ar rcs libadd.a add.o
- 在Rust中调用C函数:
在Rust项目的
Cargo.toml
文件中添加如下内容:
[package]
name = "call_c_from_rust"
version = "0.1.0"
edition = "2021"
[dependencies]
libc = "0.2"
然后在src/main.rs
中编写调用代码:
extern crate libc;
use std::ffi::CString;
use std::os::raw::c_int;
// 声明要调用的C函数
extern "C" {
fn add(a: c_int, b: c_int) -> c_int;
}
fn main() {
let a = 2;
let b = 3;
let result;
unsafe {
result = add(a, b);
}
println!("The result of add is: {}", result);
}
在上述代码中,extern "C"
块声明了要调用的C函数,并且在main
函数中使用unsafe
块来调用该C函数,因为调用外部函数绕过了Rust的安全检查机制。