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.rsverwenden und es mitrustc main.rs &&./mainkompilieren 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.