有没有办法禁用/启用println!巨集

时间:2020-08-07 13:27:29

标签: rust

我有一个程序可以自由使用println!宏。事后看来,我可能应该使用日志记录箱,因为很多println!语句只在开发环境中需要。

是否有一种简单的方法来“关闭” println!(例如,使用环境变量)?我在需要保留的代码中使用了其他宏。

3 个答案:

答案 0 :(得分:2)

我认为没有办法通过envvar禁用宏。

您可以做的是将println!本身替换为macro_rules!基本上以环境意识重新实现它(例如,在写操作之上!)。

但我建议您只是硬着头皮,用更合适的东西代替。

答案 1 :(得分:1)

可以通过条件编译来完成:

macro_rules! println {
    ($($rest:tt)*) => {
        #[cfg(debug_assertions)]
        std::println!($($rest)*)
    }
}

仅在启用debug_assertions时打印。默认情况下,它们在调试版本中启用,在发行版本中禁用。另外,您可以使用可以单独切换的功能:

macro_rules! println {
    ($($rest:tt)*) => {
        #[cfg(feature = "stdout")]
        std::println!($($rest)*)
    }
}
# Cargo.toml

[features]
stdout = []

如果需要环境变量,可以执行类似的操作

macro_rules! println {
    ($($rest:tt)*) => {
        if std::env::var("DEBUG").is_ok() {
            std::println!($($rest)*);
        }
    }
}

答案 2 :(得分:0)

您通常希望将所有调试/错误消息都通过stderr转发到eprintln!流,而不是通过stdout转发到println!,这用于程序的有用输出。

您可以从此处丢弃stderr流:

在Windows中

a.exe 2> nul 

在Linux中

./a 2> /dev/null