Types 为什么*mut i8用于ncurses中的窗口类型?

Types 为什么*mut i8用于ncurses中的窗口类型?,types,rust,Types,Rust,鉴于: A: 以及在ncurses C库(,)中的实现: 为什么窗口的类型是*mut i8 我把它看作是指向Cchar的指针,这显然是不正确的。如果您没有在Rust中实现C结构,那么简单地说指针的类型是i8,这是最佳实践吗?那是什么类型根本不重要吗?除非该项目的作者碰巧路过,否则你不会得到权威的答案 同样,您通常会在C中使用void*来表示对不透明结构的引用。作者本可以做得同样容易 pub type WINDOW = *mut c_void; 通过此更改,代码仍然可以编译 然而,有一个更好的选

鉴于:

A:

以及在ncurses C库(,)中的实现:

为什么
窗口的类型是
*mut i8


我把它看作是指向C
char
的指针,这显然是不正确的。如果您没有在Rust中实现C结构,那么简单地说指针的类型是
i8
,这是最佳实践吗?那是什么类型根本不重要吗?

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

同样,您通常会在C中使用
void*
来表示对不透明结构的引用。作者本可以做得同样容易

pub type WINDOW = *mut c_void;
通过此更改,代码仍然可以编译

然而,有一个更好的选择。作为:

要在Rust中实现这一点,让我们使用
enum
创建自己的不透明类型:

pub enum Foo {}
pub enum Bar {}

extern "C" {
    pub fn foo(arg: *mut Foo);
    pub fn bar(arg: *mut Bar);
}
通过使用不带变体的
enum
,我们创建了一个不透明类型 无法实例化,因为它没有变体。但是因为我们的
Foo
Bar
类型是不同的,我们将在它们之间获得类型安全性,所以 我们不能意外地将指向
Foo
的指针传递到
bar()

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

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

同样,该库仍然使用此更改进行编译。

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

同样,您通常会在C中使用
void*
来表示对不透明结构的引用。作者本可以做得同样容易

pub type WINDOW = *mut c_void;
通过此更改,代码仍然可以编译

然而,有一个更好的选择。作为:

要在Rust中实现这一点,让我们使用
enum
创建自己的不透明类型:

pub enum Foo {}
pub enum Bar {}

extern "C" {
    pub fn foo(arg: *mut Foo);
    pub fn bar(arg: *mut Bar);
}
通过使用不带变体的
enum
,我们创建了一个不透明类型 无法实例化,因为它没有变体。但是因为我们的
Foo
Bar
类型是不同的,我们将在它们之间获得类型安全性,所以 我们不能意外地将指向
Foo
的指针传递到
bar()

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

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

同样地,库仍然使用这种更改进行编译。

我想这是模仿
void*
(Rust没有),因为
窗口的内容从来都不重要,
窗口的内容总是通过指针进行操作。@mcarton你的意思是像
c\u void
类型那样吗^_^@Shepmaster,所以它看起来不像我,作者知道的
c\u void
:p。无论如何,它最好是一种新的专用类型。回答很好,一如既往。我想这是模仿
void*
(Rust没有),因为
WINDOW
的内容从来都不重要,
WINDOW
s总是通过指针进行操作。@mcarton你是说像
c\u void
这样的类型吗^_^@Shepmaster,所以它看起来不像我,作者知道的
c\u void
:p。无论如何,它最好是一种新的专用类型。回答很好,一如既往。哇,我完全错过了直接回答我问题的文档部分:)谢谢。哇,我完全错过了直接回答我问题的文档部分:)谢谢。