ChatGPT解决这个技术问题 Extra ChatGPT

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

使用 C 预处理器很常见,

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

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

货物的粗略等价物是:

cargo build --release 用于发布。

用于调试的货物构建。

Rust 的 #[cfg(...)] 属性或 cfg!(...) 宏如何用于做类似的事情?

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

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

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

@Shepmaster 这类似于 this question

v
vallentin

您可以使用 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();
}

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

reference

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

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


仅作记录,这在构建脚本中不起作用。只是为自己找到了这个,所以我想我会分享。
如果是 #[cfg(debug_assertions)] 而不是 #[cfg(debug_assertions)] {...},则会有 error[E0658]: attributes on expressions are experimentalerror: removing an expression is not supported in this position。锈 1.42.0