Patrząc na unix-socket
natknąłem ten kod:Dlaczego konieczne jest wykonanie dwóch rzutów na zmienny surowy wskaźnik po kolei?
let timeout = unsafe {
let mut timeout: libc::timeval = mem::zeroed();
let mut size = mem::size_of::<libc::timeval>() as libc::socklen_t;
try!(cvt(libc::getsockopt(self.0,
libc::SOL_SOCKET,
kind,
&mut timeout as *mut _ as *mut _,
&mut size as *mut _ as *mut _)));
timeout
};
byłem ciekaw tych liniach w szczególności:
&mut timeout as *mut _ as *mut _,
&mut size as *mut _ as *mut _
Dlaczego jest to konieczne, aby wykonać dwa rzuty na zmienny surowego wskaźnik w wiersz? Dlaczego nie wystarczyło by rzucać tylko raz?
Ah, rozumiem. Dzięki za wytłumaczenie! Pytanie uzupełniające: czy rdza sugeruje drugą konwersję ze względu na sygnaturę 'getsockopt' lub jest po prostu tym, że * co * wskaźnik jest rzutowany na' * mut c_void', jeśli często przeprowadzam konwersję? Nawet dla dowolnego oryginalnego typu, powiedzmy 'i mut Vec'? –
Nie, na szczęście nie! To byłoby przerażające: S To właśnie z powodu sygnatury 'getsockopt', szczególnie dlatego, że pozycja wyrażenia ma ten typ celu. To samo by miało miejsce np. jeśli robiłeś 'let ptr: * mut c_void = & mut timeout jako * mut _ jako * mut _;'. –