Types 为什么*mut i8用于ncurses中的窗口类型?
鉴于: A: 以及在ncurses C库(,)中的实现: 为什么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; 通过此更改,代码仍然可以编译 然而,有一个更好的选
窗口的类型是*mut i8
我把它看作是指向Cchar
的指针,这显然是不正确的。如果您没有在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。无论如何,它最好是一种新的专用类型。回答很好,一如既往。哇,我完全错过了直接回答我问题的文档部分:)谢谢。哇,我完全错过了直接回答我问题的文档部分:)谢谢。