在C++中,您可以取消定义和重新定义宏。例如,在视频游戏中常见的做法是在发布模式下将日志记录宏重新定义为无效。这可以确保代码完全消失,有助于提高性能。
在Rust中是否有类似的方法?
在Rust中是否有类似的方法?
macro_rules! log_if_dbg {
(...) => (if cfg!(debug_assertions) { /* do logging */ })
}
debug_assert!
的实现方式。文档中说明:
这与您的情况相同,只是针对断言而不是日志记录。查看源代码:与assert!不同,debug_assert!语句默认仅在非优化版本中启用。除非向编译器传递-C debug-assertions参数,否则优化版本将省略所有debug_assert!语句。这使得debug_assert!对于在发布版本中太昂贵的检查非常有用,但在开发过程中可能很有帮助。
macro_rules! debug_assert {
($($arg:tt)*) => (if cfg!(debug_assertions) { assert!($($arg)*); })
}
cfg(debug_assertions)
来检查是否处于调试模式。但我不知道cfg(debug_assertions)
有多稳定。#[cfg(feature = "debugging")]
macro_rules! log {
() => { println!("Debugging") }
}
#[cfg(not(feature = "debugging"))]
macro_rules! log {
() => { }
}
fn main() {
log!();
}
#[cfg(feature = "debugging")]
fn log() { println!("Debugging") }
#[cfg(not(feature = "debugging"))]
fn log() {}
fn main() {
log();
}
在这种情况下,我会非常信任优化器能够生成相同的代码。
cfg(debug_assertions)
更清晰和更健壮。 - mdupcfg(debug_assertions)
,就像我用cfg(feature...)
一样。我的方法需要一些额外的工作,但你可以将其独立于发布模式启用。 - Shepmaster