使用 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 有关。
您可以使用 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 experimental
和error: removing an expression is not supported in this position
。锈 1.42.0