rust 是否可以有条件地编译函数中的代码块?

s5a0g9ez  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(155)

我在想这种事有没有可能

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

}

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

c9x0cxw0

c9x0cxw01#

至少在Rust 1.21.1中,可以完全按照您所说的那样执行此操作(但是,* 仅在函数内部 *):

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

在此之前,不可能完全有条件地做到这一点(即。避免整个块被类型检查),RFC #16涵盖了这一点。但是,您可以使用cfg宏,根据--cfg标志计算为truefalse

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

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

v1l68za4

v1l68za42#

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

相关问题