Как проверить выпуск/отладочную сборку с использованием cfg в Rust?

С препроцессором C это обычно делается,

#if defined(NDEBUG)
    // release build
#endif

#if defined(DEBUG)
    // debug build
#endif

Грузовые грубые эквиваленты:

  • cargo build --release для выпуска.
  • cargo build для отладки.

Как использовать атрибут Rust #[cfg(...)] или макрос cfg!(...), чтобы сделать что-то подобное?

Я понимаю, что препроцессор Rust не работает как Си. Я проверил документацию, и на этой странице перечислены некоторые атрибуты. (при условии, что этот список является полным)

debug_assertions может быть проверен, но он может вводить в заблуждение, когда используется для проверки более общего случая отладки.

Я не уверен, должен ли этот вопрос быть связан с Карго или нет.

Ответ 1

Вы можете использовать debug_assertions в качестве соответствующего флага конфигурации. Он работает как с атрибутами #[cfg(...)] и с cfg! макрос:

#[cfg(debug_assertions)]
fn example() {
    println!("Debugging enabled");
}

#[cfg(not(debug_assertions))]
fn example() {
    println!("Debugging disabled");
}

fn main() {
    if cfg!(debug_assertions) {
        println!("Debugging enabled");
    } else {
        println!("Debugging disabled");
    }

    #[cfg(debug_assertions)]
    println!("Debugging enabled");

    #[cfg(not(debug_assertions))]
    println!("Debugging disabled");

    example();
}

Этот флаг конфигурации был назван как правильный способ сделать это в этом обсуждении. Больше нет подходящих встроенных условий.

Из ссылки:

debug_assertions - debug_assertions по умолчанию при компиляции без оптимизации. Это можно использовать для включения дополнительного кода отладки в разработке, но не в производстве. Например, он управляет поведением стандартной библиотеки debug_assert! макро.

Альтернативный, немного более сложный способ - использовать #[cfg(feature = "debug")] и создать скрипт сборки, который включает функцию "отладки" для вашего ящика, как показано здесь.