2016-09-24 55 views
0

鑑於this definition in the ncurses-rs crate爲什麼* mut i8用於ncurses-rs中的WINDOW類型?

pub type WINDOW = *mut i8; 

一個usage of WINDOW

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

和實施,在ncurses的C庫(​​3210,23):

// 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

我想這是模仿'void *'(Rust沒有的),因爲'WINDOW'的內容永遠不重要,'WINDOW''總是通過指針操縱。 – mcarton

+2

@mcarton你的意思就像'c_void'類型[在相同的源文件中稍高一點](https://github.com/jeaye/ncurses-rs/blob/59fbbc6456dcd87d29a7761576723dab0c08986b/src/ll.rs# L14)?^_^ – Shepmaster

+0

@Shepmaster所以它看起來像我不像作者知道'c_void':p。無論如何,它最好是一個新的專用類型。一如既往的好回答。 – mcarton

回答

6

除非該項目的作者偶然漫步,否則您將無法獲得權威答案。

因爲mcarton points out,你通常會在C中使用void *來表示對不透明結構的引用。作者可以輕鬆完成

pub type WINDOW = *mut c_void; 

通過此更改,代碼仍在編譯。

但是,還有更好的選擇。作爲the documentation says

要拉斯特做到這一點,讓我們創建我們自己的不透明類型的enum

pub enum Foo {} 
pub enum Bar {} 

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

通過使用enum沒有變,我們創建了一個不透明的類型,我們 不能實例化,因爲它沒有變體。但由於我們的FooBar 類型不同,我們會在它們兩個之間得到類型安全,所以我們不能不小心將指針傳遞到Foobar()

在這種情況下,它可能看起來像:

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

此外,圖書館還與這種變化編譯。

+0

哇,我完全錯過了直接回答我的問題的那部分文檔:)謝謝。 – mjhoy

相關問題