是否有可能在函数内有条件地编译代码块?

时间:2014-06-24 21:06:30

标签: rust conditional-compilation

我想知道这样的事情是否可能

fn main() {
    #[cfg(foo)] {
        println!("using foo config");
    }

}

上下文是一些仅使用单元测试无法充分测试的代码。我经常要做一个"演示" cfg显示信息。我正在寻找手动注释/删除某些代码部分的替代方法。

2 个答案:

答案 0 :(得分:6)

至少从Rust 1.21.1开始,就像你说的那样做到这一点:

fn main() {
    #[cfg(foo)]
    {
        println!("using foo config");
    }
}

在此之前,不可能完全有条件地执行此操作(即避免完全检查块的类型),RFC #16涵盖了这一点。但是,您可以使用基于cfg标记评估为truefalse的{​​{1}}宏:

--cfg

fn main() { if cfg!(foo) { // either `if true { ... }` or `if false { ... }` println!("using foo config"); } } 的正文始终具有名称解析和类型检查运行,因此可能无法始终有效。

答案 1 :(得分:0)

您可能对crate 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.
        }}
    }
}