我正在使用 Rust 来测试一些 C 代码:
哈哈
#include "lol.h"
int a[10]; //Assume lol.h has an extern declaration for a[10]
Run Code Online (Sandbox Code Playgroud)
库文件
extern "C" {
static a: *mut i32;
}
fn set_a(val: i32, index: usize) {
assert!(index < 10);
unsafe {
a[index] = val;
}
}
fn get_a(index: usize) {
assert!(index < 10);
unsafe { a[index] }
}
Run Code Online (Sandbox Code Playgroud)
我使用cc crate来编译和链接 lol.o。set_a和get_a函数怎么写?编译器说:
extern "C" {
static a: *mut i32;
}
fn set_a(val: i32, index: usize) {
assert!(index < 10);
unsafe {
a[index] = val;
}
}
fn get_a(index: usize) {
assert!(index < 10);
unsafe { a[index] }
}
Run Code Online (Sandbox Code Playgroud)
您可以使用该offset方法查找单个元素,或者使用std::slice::from_raw_parts_mut指针和(可能是动态的)长度创建切片,或者static mut a: *mut [i32; 10]首先使用(*a)[index](使用它)。
但是:我很确定int a[10];fromC不会导出指向该数组的指针的位置,它会导出数组的位置(即第一个元素的位置),并且extern在 Rust 中期望一个位置为给定类型(即它在两侧实现为指针),所以我会试试这个:
extern "C" {
static mut a: [i32; 10];
}
fn set_a(val: i32, index: usize) {
unsafe {
a[index] = val;
}
}
fn get_a(index: usize) -> i32 {
unsafe { a[index] }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
800 次 |
| 最近记录: |