web-dev-qa-db-fra.com

Comment vérifier les versions de publication / débogage à l'aide de cfg dans Rust?

Avec le pré-processeur C, il est courant de le faire,

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

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

Les équivalents bruts du fret sont:

  • cargo build --release Pour publication.
  • cargo build Pour le débogage.

Comment utiliser l'attribut #[cfg(...)] ou la macro cfg!(...) de Rust pour faire quelque chose de similaire?

Je comprends que le pré-processeur de Rust ne fonctionne pas comme celui de C. J'ai vérifié la documentation et cette page répertorie certains attributs . (en supposant que cette liste est complète)

debug_assertions A pu être vérifié, mais il peut être trompeur lorsqu'il est utilisé pour vérifier le cas de débogage plus général.

Je ne sais pas si cette question devrait être liée au fret ou non.

35
ideasman42

Vous pouvez utiliser debug_assertions Comme indicateur de configuration approprié. Il fonctionne avec les attributs #[cfg(...)] et la macro 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();
}

Cet indicateur de configuration a été nommé comme un moyen correct de le faire dans cette discussion . Il n'y a pas de condition intégrée plus appropriée pour l'instant.

De la référence :

debug_assertions - Activé par défaut lors de la compilation sans optimisations. Cela peut être utilisé pour activer du code de débogage supplémentaire en développement mais pas en production. Par exemple, il contrôle le comportement de la macro debug_assert! De la bibliothèque standard.

Une alternative, un peu plus compliquée, consiste à utiliser #[cfg(feature = "debug")] et à créer un script de construction qui active une fonction de "débogage" pour votre caisse, comme indiqué ici .

29
Pavel Strakhov