是否有可能有条件地编译函数内部代码块?(Is it possible to conditionall

2019-10-20 08:24发布

我想知道,如果这样的事情是可能的

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

}

上下文是一些代码,不能充分地与刚单元测试进行测试。 我经常要运行一个“演示” CFG显示信息。 我在寻找替代手工的代码输入/输出部分的一些评论。

Answer 1:

至少锈1.21.1的,这​​是可能的,你说的正是这样做:

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

在此之前,这是不可能做到这一点完全有条件(即避免块是完全型检查),这样做,是通过涵盖RFC#16 。 但是,您可以使用cfg宏观其计算结果为truefalse基础上, --cfg标志:

fn main() {
    if cfg!(foo) { // either `if true { ... }` or `if false { ... }`
        println!("using foo config");
    }
}

的身体if总是有名称解析和类型检查运行,因此可能并不总是可行的。



Answer 2:

您可能会感兴趣的箱子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.
        }}
    }
}


文章来源: Is it possible to conditionally compile a code block inside a function?