14

在 C++ 中,我使用类似这样的DEBUG宏:

#ifdef DEBUG
#define DEBUG_STDERR(x) (std::cerr << (x))
#define DEBUG_STDOUT(x) (std::cout << (x))
#else 
#define DEBUG_STDERR(x)
#define DEBUG_STDOUT(x)
#endif

Rust 有类似的东西吗?

4

4 回答 4

26

锈 1.32.0

Rust 1.32.0稳定了dbg!()宏,它输出:

  • 调用宏的文件名。
  • 调用宏的行号。
  • 参数的漂亮打印(必须实现Debug特征)。

注意: dbg!()移动其参数,因此您可能希望通过引用传递非副本类型。

示例:点数组(Playground

#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let points = [
        Point { x: 0, y: 0 },
        Point { x: 2, y: 3 },
        Point { x: 5, y: 7 },
    ];

    dbg!(&points);
}

程序输出

[src/main.rs:14] &points = [
    Point {
        x: 0,
        y: 0
    },
    Point {
        x: 2,
        y: 3
    },
    Point {
        x: 5,
        y: 7
    }
]

示例:条件编译(Playground

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

程序输出(调试模式)

---------------------Standard Error-----------------------

[src/main.rs:13] x = 4
[src/main.rs:14] x == 5 = false

---------------------Standard Output----------------------

x != 5

程序输出(发布模式)

---------------------Standard Output----------------------

x != 5

Rust 1.32.0 之前

您可以使用日志箱,也可以自己定义一个

于 2019-01-29T23:15:14.973 回答
11

尽管使用 DK 的回答中提到的 crate 之类的东西是有意义log的,但这里是如何做与您所要求的直接等效的方法:

// 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]部分:

[features]
my_debug = []

然后输出显示为cargo run --features my_debug,而不是普通的cargo run

于 2016-07-01T16:23:57.770 回答
8

您可以自己定义它们,但使用logcrate 会更简单,它为各种目的定义了几个宏(请参阅文档log

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

于 2016-07-01T09:54:21.520 回答
2

基于 Chris Emerson 回答和 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 ),*) => {()}
}

使用

log!("Don't be crazy");
log!("Answer is {}", 42);

Building by将用单位元组cargo build --release替换所有log!(...)();

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

于 2019-09-16T10:39:05.970 回答