如何重新定义宏?

Jou*_*uan 4 rust

在C++中,您可以取消定义并重新定义宏.例如,视频游戏中常见的事情是在发布模式下将日志记录宏重新定义为空.这可以保证代码完全消失,从而有助于提高性能.

有没有办法在Rust做类似的事情?

mdu*_*dup 6

基本上你可能会这样做:

macro_rules! log_if_dbg {
    (...) => (if cfg!(debug_assertions) { /* do logging */ })
}
Run Code Online (Sandbox Code Playgroud)

这就是 debug_assert!的实现方式.医生说:

与assert!,debug_assert不同!默认情况下,语句仅在非优化构建中启用.优化的构建将省略所有debug_assert!语句,除非-C debug-assertions传递给编译器.这使得debug_assert!对于过于昂贵而无法在发布版本中出现但在开发期间可能有用的检查非常有用.

这与您的情况相同,仅用于断言,而不是记录.看源头:

macro_rules! debug_assert {
    ($($arg:tt)*) => (if cfg!(debug_assertions) { assert!($($arg)*); })
}
Run Code Online (Sandbox Code Playgroud)

这个也在Rust用户论坛上进行了简要讨论,其中摘要是cfg(debug_assertions)检查我们是否处于调试模式的方法.

但是,我不知道它有多稳定cfg(debug_assertions).