tao-of-rust-codes
tao-of-rust-codes copied to clipboard
[第十三章] 13.3.2 代码清单 13-57
页码与行数
- 第517页
- 第5行
代码可精简
精简为如下代码,在安全抽象上,不需要用户再次输入对应 slices 的长度
// 链接名为libsorting的静态库
#[link(name = "sorting", kind = "static")]
extern {
// 绑定CPP中的interop_sort函数
// 注意参数类型要和CPP中的类型相对应
fn interop_sort(arr: &[i32;10], n: u32);
}
// 对interop_sort函数的安全抽象
pub fn sort_from_cpp(arr: &[i32; 10]) {
unsafe {
interop_sort(arr, arr.len() as u32);
}
}
fn main() {
let my_arr: [i32;10] = [10, 42, -9, 12, 8, 25, 7, 13, 55, -1];
println!("Before sorting...");
println!("{:?}\n", my_arr);
sort_from_cpp(&my_arr);
println!("After sorting...");
println!("{:?}", my_arr);
}
@driftluo 感谢反馈
我觉得精简还是不够,不应该有长度的限制,应该直接传指针才对,如下:
// 链接名为libsorting的静态库
#[link(name = "sorting", kind = "static")]
extern {
// 绑定CPP中的interop_sort函数
// 注意参数类型要和CPP中的类型相对应
fn interop_sort(arr: *const i32, n: u32);
}
// 对interop_sort函数的安全抽象
pub fn sort_from_cpp(arr: &[i32]) {
unsafe {
interop_sort(arr.as_ptr(), arr.len() as u32);
}
}
fn main() {
let my_arr = vec![10, 42, -9, 12, 8, 25, 7, 13, 55, -1];
println!("Before sorting...");
println!("{:?}\n", my_arr);
sort_from_cpp(&my_arr);
println!("After sorting...");
println!("{:?}", my_arr);
}