Debugging Rust有调试宏吗? 在C++中,我使用了类似的代码调试宏:< /p> #ifdef调试 #define DEBUG_STDERR(x)(std::cerr

Debugging Rust有调试宏吗? 在C++中,我使用了类似的代码调试宏:< /p> #ifdef调试 #define DEBUG_STDERR(x)(std::cerr,debugging,rust,debug-print,Debugging,Rust,Debug Print,您可以自己定义它们,但使用板条箱会更简单,因为板条箱定义了多个宏用于各种用途(请参阅) 请注意,板条箱仅提供用于日志记录的前端;您还需要选择后端。日志文档中有一个基本示例,或者您可以使用类似或的内容。尽管使用DK的回答中提到的类似于日志板条箱的内容是有意义的,但下面介绍了如何进行直接等效操作关于你的问题: // The debug version #[cfg(feature = "my_debug")] macro_rules! debug_print { ($( $args:expr

您可以自己定义它们,但使用板条箱会更简单,因为板条箱定义了多个宏用于各种用途(请参阅)


请注意,板条箱仅提供用于日志记录的前端;您还需要选择后端。
日志
文档中有一个基本示例,或者您可以使用类似或的内容。

尽管使用DK的回答中提到的类似于
日志
板条箱的内容是有意义的,但下面介绍了如何进行直接等效操作关于你的问题:

// The debug version
#[cfg(feature = "my_debug")]
macro_rules! debug_print {
    ($( $args:expr ),*) => { println!( $( $args ),* ); }
}

// Non-debug version
#[cfg(not(feature = "my_debug"))]
macro_rules! debug_print {
    ($( $args:expr ),*) => {}
}

fn main() {
    debug_print!("Debug only {}", 123);
}
在您的
Cargo.toml
中,添加
[功能]
部分:

[features]
my_debug = []
然后,输出显示为
货物运行--功能为my_debug
,而不是普通的
货物运行

Rust 1.32.0 稳定宏,输出:

  • 调用宏的文件名
  • 调用宏的行号
  • 参数的漂亮打印(必须实现该特性)
注意:
dbg!()
移动其参数,因此您可能希望通过引用传递非复制类型

示例:点数组() 程序输出

[src/main.rs:14]&点数=[
点{
x:0,,
y:0
},
点{
x:2,
y:3
},
点{
x:5,
y:7
}
]
示例:条件编译() OP表示希望仅在调试模式下编译时显示调试内容

以下是实现这一目标的方法:

#[cfg(debug_assertions)]
macro_rules! debug {
    ($x:expr) => { dbg!($x) }
}

#[cfg(not(debug_assertions))]
macro_rules! debug {
    ($x:expr) => { std::convert::identity($x) }
}

fn main() {
    let x = 4;
    debug!(x);
    if debug!(x == 5) {
        println!("x == 5");
    } else {
        println!("x != 5");
    }
}
程序输出(调试模式)

--------------标准错误-----------------------
[src/main.rs:13]x=4
[src/main.rs:14]x==5=false
---------------------标准输出----------------------
x!=5
程序输出(释放模式)

--------------标准输出----------------------
x!=5
锈蚀前1.32.0
你可以也可以。

宏基于Chris Emerson answer和CJ McAllister的评论

// Disable warnings

#[allow(unused_macros)]

// The debug version

#[cfg(debug_assertions)]
macro_rules! log {
    ($( $args:expr ),*) => { println!( $( $args ),* ); }
}

// Non-debug version

#[cfg(not(debug_assertions))]
macro_rules! log {
    ($( $args:expr ),*) => {()}
}
使用

货物生成生成-发布将用单位元组
();
替换所有
日志!(…)


我没有找到替换为空的方法,但我认为编译器会这样做。

这可以通过利用现有的
debug\u断言
属性来更简洁一些,该属性控制宏,例如
debug\u assert!
。只需将
#[cfg(feature=“my\u debug”)]
位更改为
#[cfg(debug\u断言)]
并将更改放到
Cargo.toml
。这样,对于发布版本,调试代码会自动被忽略!现在,这会导致“错误:扩展到项的宏必须用大括号分隔或后跟分号”我有rust 1.50,但即使使用“cargo build--release”编译,我也会得到输出?如何在release模式下禁用它?
// Disable warnings

#[allow(unused_macros)]

// The debug version

#[cfg(debug_assertions)]
macro_rules! log {
    ($( $args:expr ),*) => { println!( $( $args ),* ); }
}

// Non-debug version

#[cfg(not(debug_assertions))]
macro_rules! log {
    ($( $args:expr ),*) => {()}
}
log!("Don't be crazy");
log!("Answer is {}", 42);