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

A.B*_*.B. 1 conditional-compilation rust

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

huo*_*uon 7

至少从Rust 1.21.1开始,就像你说的那样:

fn main() {
    #[cfg(foo)]
    {
        println!("using foo config");
    }
}
Run Code Online (Sandbox Code Playgroud)

在此之前,不可能完全有条件地执行此操作(即避免完全检查块的类型),这是RFC#16所涵盖的.但是,您可以使用cfg评估为true或者false基于--cfg标志的宏:

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

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

  • 请注意,您只能在函数内使用这样的块,而不能在文件的顶层使用。在这个封闭的 RFC 问题中,有一些关于原因的讨论:https://github.com/rust-lang/rfcs/pull/2377 (3认同)