Bedingte Kompilierung mit dem Rust-cfg-Attribut

Beginner

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

Einführung

In diesem Lab lernst du über das cfg-Attribut und die cfg!-Makro in Rust, die jeweils bedingte Prüfungen bei der Konfiguration und der Auswertung ermöglichen. Das cfg-Attribut ermöglicht die bedingte Kompilierung, während das cfg!-Makro zur Laufzeit als wahr oder falsch ausgewertet wird. Codeblöcke, die cfg! verwenden, müssen unabhängig vom Auswertungsergebnis gültig sein, im Gegensatz zu #[cfg], das Code entfernen kann.

Hinweis: Wenn das Lab keinen Dateinamen angibt, kannst du einen beliebigen Dateinamen verwenden. Beispielsweise kannst du main.rs verwenden und es mit rustc main.rs &&./main kompilieren und ausführen.

cfg

Konfigurationsbedingte Prüfungen sind über zwei verschiedene Operatoren möglich:

  • das cfg-Attribut: #[cfg(...)] an Attributposition
  • das cfg!-Makro: cfg!(...) in booleschen Ausdrücken

Während das erstere die bedingte Kompilierung ermöglicht, wird das letztere bedingt zu true oder false-Literalen ausgewertet, was Prüfungen zur Laufzeit ermöglicht. Beide verwenden die gleiche Argumentsyntax.

Im Gegensatz zu #[cfg] entfernt cfg! keinen Code und wertet nur zu true oder false aus. Beispielsweise müssen alle Blöcke in einem if/else-Ausdruck gültig sein, wenn cfg! für die Bedingung verwendet wird, unabhängig davon, was cfg! auswertet.

// Diese Funktion wird nur kompiliert, wenn das Zielbetriebssystem linux ist
#[cfg(target_os = "linux")]
fn are_you_on_linux() {
    println!("You are running linux!");
}

// Und diese Funktion wird nur kompiliert, wenn das Zielbetriebssystem *nicht* linux ist
#[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!");
    }
}

Zusammenfassung

Herzlichen Glückwunsch! Du hast das Cfg-Lab abgeschlossen. Du kannst in LabEx weitere Labs absolvieren, um deine Fähigkeiten zu verbessern.