鉴于this definition in the ncurses-rs crate:
pub type WINDOW = *mut i8;
pub fn newwin(_:c_int,_:c_int,_:c_int,_:c_int) -> WINDOW;
// 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
类型的?这根本不重要吗?
答案 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类型 无法实例化,因为它没有变体。但是因为我们的Foo
和Bar
类型不同,我们会在两者之间获得类型安全,所以 我们不会意外地将指针传递给Foo
到bar()
。
在这种情况下,它可能看起来像:
pub enum Window {}
pub type WINDOW = *mut Window;
同样,图书馆仍然会编译这一变化。