2017-01-14 1 views
1

일부 libc 함수. sigemptyset(set: *mut sigset_t) 변수에 대한 포인터를 가져 와서 초기화되지 않은 것으로 간주하고 초기화합니다.초기화되지 않은 변수를 선언하는 더 좋은 방법

가이 코드와 끝까지 :

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

이 괜찮습니다,하지만 난 때 나는 이런 식으로 뭔가와 끝까지 그 변수의 많은 :

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 문이 실제로 튜플을 수행한다는 것을 새로운 것이었고 이것을 '초기화되지 않은'것으로 지정할 수 있고 튜플을 세 개의 변수로 "분해"합니다. 유령 같은! :) – hansaplast

+1

와우, 내가 읽은 위험한 기능에 대한 최고의 문서입니다. 포인터 주셔서 감사! (의도 한 말장난 없음) –

관련 문제