Введение
В этом лабе вы узнаете о атрибуте cfg и макросе cfg! в Rust, которые позволяют выполнять условные проверки при настройке и вычислении соответственно. Атрибут cfg позволяет выполнять условную компиляцию, в то время как макрос cfg! вычисляется в true или false во время выполнения. Блоки кода, использующие cfg!, должны быть валидными независимо от результата вычисления, в отличие от #[cfg], который может удалять код.
Примечание: Если в лабе не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать
main.rs, скомпилировать и запустить его с помощьюrustc main.rs &&./main.
cfg
Возможны условные проверки конфигурации с помощью двух различных операторов:
- атрибут
cfg:#[cfg(...)]в позиции атрибута - макрос
cfg!:cfg!(...)в логических выражениях
В то время как первый позволяет выполнять условную компиляцию, второй условно вычисляется до true или false литералов, что позволяет выполнять проверки во время выполнения. Оба используют идентичный синтаксис аргументов.
cfg!, в отличие от #[cfg], не удаляет никакого кода и только вычисляется до true или false. Например, все блоки в выражении if/else должны быть валидными, когда cfg! используется для условия, независимо от того, что оценивает cfg!.
// Эта функция компилируется только если целевая ОС - linux
#[cfg(target_os = "linux")]
fn are_you_on_linux() {
println!("You are running linux!");
}
// А эта функция компилируется только если целевая ОС *не* 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!");
}
}
Резюме
Поздравляем! Вы завершили лабу Cfg. Вы можете практиковаться в более лабах в LabEx, чтобы улучшить свои навыки.