面试题答案
一键面试在Rust中与C语言进行基本数据类型的互操作,可以使用#[no_mangle]
属性来标记函数,使其在链接时保持原有的名称,方便C语言调用。同时,Rust标准库提供了std::os::raw
模块,包含了与C语言基本数据类型对应的类型定义。
- 传递和接收C语言的
int
类型数据- 在Rust中,C语言的
int
类型对应std::os::raw::c_int
。 - 以下是一个简单的代码示例,展示如何在Rust中定义函数接收C语言的
int
类型数据并返回处理结果:
- 在Rust中,C语言的
// 引入与C语言基本数据类型对应的模块
use std::os::raw::c_int;
// 定义一个可以被C语言调用的函数,接收一个c_int类型参数并返回一个c_int类型结果
#[no_mangle]
pub extern "C" fn add_one(x: c_int) -> c_int {
x + 1
}
上述代码定义了一个add_one
函数,它接收一个C语言的int
类型(在Rust中为c_int
)参数,并返回一个c_int
类型结果,即传入值加1。
- 编译为动态链接库供C语言调用
- 在
Cargo.toml
文件中添加以下内容,指定构建为动态库:
- 在
[lib]
name = "my_rust_lib"
crate-type = ["cdylib"]
- 然后使用
cargo build --release
命令构建动态链接库。
- C语言调用示例
#include <stdio.h>
// 声明从Rust动态链接库导入的函数
extern int add_one(int x);
int main() {
int result = add_one(5);
printf("The result is: %d\n", result);
return 0;
}
这个C语言程序调用了从Rust动态链接库导入的add_one
函数,并输出结果。注意,在实际运行时,需要确保C语言程序能够找到Rust生成的动态链接库。具体方法因操作系统而异,例如在Linux下可以通过设置LD_LIBRARY_PATH
环境变量,在Windows下可以将动态链接库放在可执行文件相同目录或系统搜索路径下。