如何在Rust中使用cfg检查发布/调试版本?

时间:2016-08-29 11:14:25

标签: debugging rust preprocessor rust-cargo

使用C预处理器,这是常见的,

#if defined(NDEBUG)
    // release build
#endif

#if defined(DEBUG)
    // debug build
#endif

货物的粗略等价物是:

  • cargo build --release发布。
  • cargo build进行调试。

如何使用Rust的#[cfg(...)]属性或cfg!(...)宏来执行类似的操作?

我知道Rust的预处理器不像C那样工作。我检查了文档和this page lists some attributes(假设此列表是全面的)

可以检查

debug_assertions,但在用于检查更一般的调试用例时可能会产生误导。

我不确定这个问题是否与Cargo有关。

1 个答案:

答案 0 :(得分:21)

您可以使用debug_assertions作为相应的配置标志。它适用于#[cfg(...)]属性和cfg!宏:

#[cfg(debug_assertions)]
fn example() {
    println!("Debugging enabled");
}

#[cfg(not(debug_assertions))]
fn example() {
    println!("Debugging disabled");
}

fn main() {
    if cfg!(debug_assertions) {
        println!("Debugging enabled");
    } else {
        println!("Debugging disabled");
    }

    example();
}

此配置标志被命名为在this discussion中执行此操作的正确方法。目前没有更合适的内置条件。

来自reference

  

debug_assertions - 默认情况下在没有编译时启用   优化。这可用于启用额外的调试代码   发展但不是生产。例如,它控制着   标准库的debug_assert!宏的行为。

另一种稍微复杂的方法是使用#[cfg(feature = "debug")]并创建一个构建脚本,为您的包创建“调试”功能,如here所示。