MST
星途 面试题库

面试题:Rust与C语言的基本互操作方式

请描述Rust与C语言进行互操作时,如何使用`extern`关键字来定义可被C调用的Rust函数,以及如何在Rust中调用C函数?并给出简单示例代码。
22.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

定义可被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函数

  1. 创建C代码: 首先编写C函数,例如创建一个add.c文件:
int add(int a, int b) {
    return a + b;
}
  1. 编译C代码为静态库: 在命令行中使用gcc编译成静态库,假设系统是Linux,命令如下:
gcc -c -o add.o add.c
ar rcs libadd.a add.o
  1. 在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的安全检查机制。