在 Rust 中进行条件编译的其他情况

Wil*_*lor 5 rust

如何仅在没有 cfg 块匹配时才编译某些代码?例如这样的事情:

#IF NUM == 1
//something
#ELSE IF NUM == 2
// something
#ELSE
// no case match, panic!
#ENDIF
Run Code Online (Sandbox Code Playgroud)

Mas*_*inn 9

手工例如

#[cfg(thing1)]
// something
#[cfg(all(not(thing1), thing2))]
// something
#[cfg(all(not(thing1), not(thing2)))]
// no case
Run Code Online (Sandbox Code Playgroud)

或者,在一个函数中,如果你的“东西”在任何情况下都是可编译的,你可以使用cfg!. 由于它计算为文字,因此优化器很有可能会删除不匹配的位:

if cfg!(thing1) {
    // something
} else if cfg!(thing2) {
    // something
} else {
    panic!();
}
Run Code Online (Sandbox Code Playgroud)

虽然compile_error比恐慌更有意义。

还有一个cfg-if板条箱,可以放置更符合人体工程学的东西。

有关该主题的更多信息,请参阅文章Yak shaving 条件编译 Rust,它扩展并讨论了各种方法。