我在头文件中有这段代码:
typedef struct _game* Game;
现在我正在做Rust的FFI:
extern "C" {
pub type Game = usize;
}
有没有更安全的方法来做到这一点,而不是像指针大小的数字类型一样对待它?这会有用吗?
pub struct Game(usize);
答案 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的惯例。