// rust
#[repr(C)]
struct Foo {
a: isize,
b: isize
}
impl Foo {
pub fn method1() {
...
}
pub fn method2(x: isize) -> isize {
...
}
pub fn method3(x: isize, y: isize) -> isize {
...
}
}
struct Foo {
int a;
int b;
}
void foo_method1(Foo* foo);
int foo_method2(Foo* foo, int x);
int foo_method1(Foo* foo, int x, int y);
// We have struct Foo now
#[no_mangle]
unsafe extern "C" fn foo_method1(foo: *const Foo) {
let foo = &*foo;
foo.method1();
}
#[no_mangle]
unsafe extern "C" fn foo_method2(foo: *const Foo, x: isize) -> isize {
let foo = &*foo;
foo.method2(x)
}
#[no_mangle]
unsafe extern "C" fn foo_method3(foo: *const Foo, x: isize, y: isize) -> isize {
let foo = &*foo;
foo.method3(x, y)
}
#[repr(C)]
struct Buffer<T> {
data: [T; 8],
len: usize,
}
impl<T> Buffer<T> {
pub fn print(&self) {
...
}
}
#[no_mangle]
extern "C" fn buffer_print_i32(buf: Buffer<i32>) { ... }
#[no_mangle]
extern "C" fn buffer_print_f32(buf: Buffer<f32>) { ... }
struct Buffer_i32 {
int32_t data[8];
size_t len;
};
struct Buffer_f32 {
float data[8];
size_t len;
};
void buffer_print_i32(Buffer_i32 buf);
void buffer_print_f32(Buffer_f32 buf);
type 关键字,正好在 C 中,有 typedef 这个关键字,起到类似的功能。// type.rs
#[repr(C)]
struct Buffer<T> {
data: [T; 8],
len: usize,
}
type IntBuffer = Buffer<i32>;
#[no_mangle]
extern "C" fn buffer_print_int(buf: IntBuffer) { }
struct Buffer_i32 {
int32_t data[8];
size_t len;
};
typedef Buffer_i32 IntBuffer;
void buffer_print_int(IntBuffer buf);
enum Foo; 这种形式。空枚举没有变体,是一个空类型,等于 !。enum SomeEnum {
A,
B,
C,
}
enum SomeEnum {
Variant22 = 22,
Variant44 = 44,
Variant45,
}
enum Foo {
Bar(String),
Baz,
}
#[repr(C)]
enum SomeEnum {
A,
B,
C,
}
#[repr(C)]
enum SomeEnum {
A,
B,
C,
}
原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。