声明未初始化变量的更好方法

时间:2017-01-14 14:02:30

标签: initialization rust

一些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。

1 个答案:

答案 0 :(得分:5)

幸运的是,元组也是正常类型。那怎么样:

code = 0;

try
    your_script
catch ME
    fprintf(2, 'CAUGHT EXCEPTION:\n');
    fprintf(2, '%s(%d): %s\n', ME.stack.file, ME.stack.line, ME.message);
    code = 1;
end

exit(code)

然而,它不会比这更好。最好的办法是将所有变量组合成一个更大的类型(如元组或结构)并取消初始化。

但是,不安全的事情写得很冗长,很烦人。未初始化的变量确实非常危险,尤其是在处理void main (void) { char s[] = "Programming is hard"; printf("%s", &s); printf("%s", s); return 0; } 类型时。我相信你已经知道,但我仍然想确保所有人都阅读the documentation of uninitialized()以了解所有可能的陷阱。