Есть ли способ отключить / включить println! макрос - PullRequest
0 голосов
/ 07 августа 2020

У меня есть программа, которая свободно использует макрос println!. Оглядываясь назад, я, вероятно, должен был использовать ящик для журналирования, поскольку многие из этих println! операторов мне нужны только в среде разработки.

Есть ли простой способ «выключить» println!, например, с переменной окружения? Я использую в коде другие макросы, которые мне нужно сохранить.

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

Я не думаю, что есть способ отключить макрос с помощью envvar.

Что вы могли бы сделать, так это заменить сам println! на macro_rules! в основном переопределяя его (например, поверх записи!) с учетом окружающей среды.

Но я бы рекомендовал просто укусить пулю и заменить ее чем-то более подходящим.

1 голос
/ 07 августа 2020

Это можно сделать с помощью условной компиляции:

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)*);
        }
    }
}
0 голосов
/ 07 августа 2020

Обычно вы хотите пересылать все сообщения отладки / ошибок в STDERR через eprintln! вместо STROUT через println!, который используется для полезного вывода вашей программы.

Оттуда вы можете отказаться от STDERR поток:

в Windows

a.exe 2> nul 

в Linux

./a 2> /dev/null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...