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);