2017-01-14 4 views
1

いくつかのlibc関数。 sigemptyset(set: *mut sigset_t)変数へのポインタをとり、初期化されていないものとして扱い、初期化します。初期化されていない変数を宣言する方が良い方法

私はこのコードで終わる:

let mut newmask = std::mem::uninitialized(); 
libc::sigemptyset(&mut newmask); 

これはOKですが、私はこのようなもので、私が終わるこれらの変数の多くを持っている場合:

let mut newmask = std::mem::uninitialized(); 
let mut oldmask = std::mem::uninitialized(); 
let mut pendmask = std::mem::uninitialized(); 

私はそれを凝縮できます。

use std::mem::unitialized as uninit; 
let (mut newmask, mut oldmask, mut pendmask) = (uninit(), uninit(), uninit()); 

このコードを書く方がいいですか?教育目的のために、私は明示的にlibcを使いたいと思っています。

答えて

5

幸いにも、タプルも普通型です。だから約:

let (mut newmask, mut oldmask, mut pendmask) = std::mem::uninitialized(); 

しかし、それはこれ以上ずっと良いことはありません。あなたのベスト・ベットは、すべての変数を(タプルや構造体のような)より大きな型に結合し、その初期化を解除することです。

しかし、安全でないものは冗長で書き込みが厄介です。初期化されていない変数は、特にDropの型を扱う場合、実際には非常に危険です。私はあなたがすでに意識していると確信していますが、誰もが確実にすべての落とし穴を理解するためにthe documentation of uninitialized()を読むようにしたいと思います。

+0

私は「初期化されていない」が危険であることを知りました。私はFFI関数にそれらを書き込ませるためにそれらを使用しています。 letステートメントが実際にタプルを行い、これを「初期化されていない」として指定し、その後タプルを3つの変数に「分解」するという新しいことがありました。不気味な! :) – hansaplast

+1

うわー、それは私が今まで読んだことがある危険な機能のための最良のドキュメントです。ポインタありがとう! (意図された馬小屋) –

関連する問題