C抽象数据类型在Rust中

时间:2016-06-14 09:56:26

标签: c rust ffi abstract-data-type

我在头文件中有这段代码:

typedef struct _game* Game;

现在我正在做Rust的FFI:

extern "C" {
    pub type Game = usize;
}

有没有更安全的方法来做到这一点,而不是像指针大小的数字类型一样对待它?这会有用吗?

pub struct Game(usize);

1 个答案:

答案 0 :(得分:3)

您通常使用指向空枚举的指针在Rust中为抽象C类型建模:

pub enum _game {}
pub type Game = *mut _game;

这种方法明确地强调了一个事实,即你不能自己创建_game的值 - 你只能从某个地方获得指向它的指针。

也就是说,如果你正在为你的库编写更高级的包装器,你应该将这个Game包装成更高级别的Game,如下所示:

extern crate your_library_sys;

pub struct Game(your_library_sys::Game);

此处your_library_sys是一个“sys”包,其中包含对库的低级FFI绑定。这是Cargo docs中described的惯例。