cfg

環境に応じたコンパイルをするには2種類の方法があります。

  • cfgアトリビュート:#[cfg(...)]をアトリビュートとして使用する。
  • cfg!マクロ:cfg!(...)をブーリアンとして評価する。

前者は条件付きコンパイルを行いますが、後者はtrueまたはfalseリテラルに評価され実行時にチェックすることが可能です。いずれの場合も適切なシンタックスで記述する必要があります。

#[cfg]と異なり、cfg!はコードを削除せず、trueまたはfalseに評価されるだけです。例えば、cfg!が何を評価しているかに関係なく、cfg!が条件に利用されるとき、if/else式の中のすべてのブロックが有効でなくてはなりません。

// この関数はターゲットOSがLinuxの時のみコンパイルされます。
#[cfg(target_os = "linux")]
fn are_you_on_linux() {
    println!("You are running linux!");
}

// そしてこの関数はターゲットOSが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!, マクロ.