2017-01-14 7 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 на самом деле делает кортеж, и вы можете указать это как «uninitialized», а затем кортеж «разобран» на три переменные. Ужасный! :) – hansaplast

+1

Вау, это лучшая документация для опасной функции, которую я когда-либо читал. Спасибо за указатель! (Каламбур не предназначен) –

Смежные вопросы