当前位置:  开发笔记 > 编程语言 > 正文

为什么有必要对一行中的可变原始指针执行两次转换?

如何解决《为什么有必要对一行中的可变原始指针执行两次转换?》经验,为你挑选了1个好方法。

在查看时unix-socket,我遇到了这段代码:

let timeout = unsafe {
    let mut timeout: libc::timeval = mem::zeroed();
    let mut size = mem::size_of::() 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
};

我特别好奇这些线条:

&mut timeout as *mut _ as *mut _,
&mut size as *mut _ as *mut _

为什么有必要对一行中的可变原始指针执行两次转换?为什么仅仅施放一次就不够了?



1> Jorge Israel..:

timeout例如对应于一个*mut c_void参数:

pub unsafe extern fn getsockopt(sockfd: c_int, level: c_int, optname: c_int,
                                optval: *mut c_void, optlen: *mut socklen_t) -> c_int

timeout文件中的定义为:

let mut timeout: libc::timeval = mem::zeroed();

所以这是类型libc::timeval.现在让我们考虑一下:

&mut timeout as *mut _ as *mut _

首先你是&mut timeout这样的&mut libc::timeval.然后你as *mut _将它强制转换为推断类型的原始可变指针,在这种情况下它是相同的类型libc::timeval,所以到目前为止的完整类型是:*mut libc::timeval,它与参数类型不匹配*mut c_void.最后as *mut _再次推断目标类型,现在是参数类型*mut c_void,所以最终强制转换*mut libc::timeval为a *mut c_void.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有