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

问题描述 投票:1回答:2

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

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

}

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

rust conditional-compilation
2个回答
6
投票

至少从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的主体总是有名称解析和类型检查运行,所以可能并不总是有效。


0
投票

你可能对箱子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.
        }}
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.