我想知道这样的事情是否可行
fn main() {
#[cfg(foo)] {
println!("using foo config");
}
}
上下文是一些仅使用单元测试无法充分测试的代码。我经常要运行一个显示信息的“demo”cfg。我正在寻找手动注释/删除某些代码部分的替代方法。
至少从Rust 1.21.1开始,就像你说的那样:
fn main() {
#[cfg(foo)]
{
println!("using foo config");
}
}
在此之前,不可能完全有条件地执行此操作(即避免完全检查块的类型),这样做由RFC #16涵盖。但是,您可以使用cfg
宏,该宏根据true
标记计算为false
或--cfg
:
fn main() {
if cfg!(foo) { // either `if true { ... }` or `if false { ... }`
println!("using foo config");
}
}
if
的主体总是有名称解析和类型检查运行,所以可能并不总是有效。
你可能对箱子cfg-if感兴趣,或者一个简单的宏会做:
macro_rules! conditional_compile {
($(#[$ATTR:meta])* { $CODE: tt }) => {
{
match 0 {
$(#[$ATTR])*
0 => $CODE,
// suppress clippy warnning `single_match`.
1 => (),
_ => (),
}
}
}
}
fn main() {
conditional_compile{
#[cfg(foo)]
{{
println!("using foo config");
// Or something only exists in cfg foo, like a featured mod.
}}
}
}