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

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

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

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

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

Cargo 的大致等价物是:

  • cargo build --release
    发布。
  • cargo build
    用于调试。

Rust 的

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

我知道 Rust 的预处理器不像 C 那样工作。我检查了文档,此页面列出了一些属性(假设此列表很全面)

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

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

debugging rust preprocessor rust-cargo
2个回答
209
投票

您可以使用

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");
    }

    #[cfg(debug_assertions)]
    println!("Debugging enabled");

    #[cfg(not(debug_assertions))]
    println!("Debugging disabled");

    example();
}

此配置标志在此讨论中被命名为执行此操作的正确方法。暂时没有更合适的内置条件

来自参考

debug_assertions
- 编译时默认启用 优化。这可用于启用额外的调试代码 开发但未投入生产。例如,它控制 标准库的
debug_assert!
宏的行为。

另一种稍微复杂的方法是使用

#[cfg(feature = "debug")]
并创建一个构建脚本,为您的板条箱启用“调试”功能,如此处所示。


0
投票

有用于此目的的 at_debug 板条箱。

© www.soinside.com 2019 - 2024. All rights reserved.