Compilation conditionnelle avec l'attribut cfg de Rust

Beginner

This tutorial is from open-source community. Access the source code

Introduction

Dans ce laboratoire, vous allez découvrir l'attribut cfg et le macro cfg! en Rust, qui permettent respectivement des vérifications conditionnelles dans la configuration et l'évaluation. L'attribut cfg active la compilation conditionnelle, tandis que le macro cfg! évalue à vrai ou faux au moment de l'exécution. Les blocs de code utilisant cfg! doivent être valides indépendamment du résultat de l'évaluation, contrairement à #[cfg] qui peut supprimer du code.

Note : Si le laboratoire ne spécifie pas de nom de fichier, vous pouvez utiliser n'importe quel nom de fichier que vous voulez. Par exemple, vous pouvez utiliser main.rs, le compiler et l'exécuter avec rustc main.rs &&./main.

cfg

Il est possible de réaliser des vérifications conditionnelles de configuration grâce à deux opérateurs différents :

  • l'attribut cfg : #[cfg(...)] en position d'attribut
  • le macro cfg! : cfg!(...) dans des expressions booléennes

Alors que le premier active la compilation conditionnelle, le second évalue conditionnellement à des littéraux true ou false, permettant des vérifications au moment de l'exécution. Les deux utilisent la même syntaxe d'arguments.

Contrairement à #[cfg], cfg! n'enlève aucun code et n'évalue qu'à true ou false. Par exemple, tous les blocs dans une expression if/else doivent être valides lorsque cfg! est utilisé pour la condition, quelle que soit l'évaluation de cfg!.

// Cette fonction n'est compilée que si le système d'exploitation cible est linux
#[cfg(target_os = "linux")]
fn are_you_on_linux() {
    println!("You are running linux!");
}

// Et cette fonction n'est compilée que si le système d'exploitation cible n'est *pas* linux
#[cfg(not(target_os = "linux"))]
fn are_you_on_linux() {
    println!("You are *not* running linux!");
}

fn main() {
    are_you_on_linux();

    println!("Are you sure?");
    if cfg!(target_os = "linux") {
        println!("Yes. It's definitely linux!");
    } else {
        println!("Yes. It's definitely *not* linux!");
    }
}

Résumé

Félicitations ! Vous avez terminé le laboratoire Cfg. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.