为什么* mut i8用于ncurses-rs中的WINDOW类型?

时间:2016-09-24 21:38:48

标签: types rust

鉴于this definition in the ncurses-rs crate

pub type WINDOW = *mut i8;

A usage of WINDOW

pub fn newwin(_:c_int,_:c_int,_:c_int,_:c_int) -> WINDOW;

和实现,在ncurses C库中(123):

// 1:
typedef struct _win_st WINDOW;
// 2:
struct _win_st { 
    /* lots of fields... */
};
// 3: 
(WINDOW *) newwin (int,int,int,int);

为什么类型为WINDOW *mut i8

我正在阅读它作为指向C char的指针,这显然是不正确的。如果你没有在Rust中实现C结构,那么最好简单地说一个指针是i8类型的?这根本不重要吗?

1 个答案:

答案 0 :(得分:6)

除非该项目的作者碰巧过去,否则你不会得到权威的答案。

作为mcarton points out,您通常会在C中找到void *来表示对不透明结构的引用。作者可以轻松完成

pub type WINDOW = *mut c_void;

通过此更改,代码仍会编译。

然而,有一个更好的选择。正如the documentation says

  

要在Rust中执行此操作,让我们使用enum创建自己的不透明类型:

pub enum Foo {}
pub enum Bar {}

extern "C" {
    pub fn foo(arg: *mut Foo);
    pub fn bar(arg: *mut Bar);
}
     

通过使用没有变体的enum,我们创建了一个opaque类型   无法实例化,因为它没有变体。但是因为我们的FooBar   类型不同,我们会在两者之间获得类型安全,所以   我们不会意外地将指针传递给Foobar()

在这种情况下,它可能看起来像:

pub enum Window {}
pub type WINDOW = *mut Window;

同样,图书馆仍然会编译这一变化。