2016-09-24 8 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

'WINDOW'の内容は決して重要ではなく、' WINDOW'は常にポインタで操作されるので、これは 'void *'(Rustにはありません)と似ていると思います。 – mcarton

+2

@mcartonあなたは、 ''同じソースファイルのちょっと高いところにある 'c_void'のようなものです(https://github.com/jeaye/ncurses-rs/blob/59fbbc6456dcd87d29a7761576723dab0c08986b/src/ll.rs# L14)?^_^ – Shepmaster

+0

@Shepmaster私とは違って見えるので、作者は 'c_void'について知っていました。とにかく新しい専用のタイプにするのが良いでしょう。ニースの答えは、いつものように。 – 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 の型が異なるので、2つの型の間で型の安全性が確保されるので、 Fooへのポインタを誤ってbar()に渡すことはできません。この場合

、それは次のようになります。もう一度

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

、ライブラリーはまだこの変化にコンパイルされます。

+0

うわー、私は完全に私の質問に直接答えるドキュメントのその部分を逃した:)ありがとう。 – mjhoy

関連する問題