使用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有关。
答案 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所示。