Условная компиляция с использованием атрибута cfg в Rust

Beginner

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

Введение

В этом лабе вы узнаете о атрибуте 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, чтобы улучшить свои навыки.