S-JIS[2025-02-01] 変更履歴

Rust cfg属性

Rustのcfg属性のメモ。

  • Rust By Example 日本語版のcfg
  • cfg!

概要

#[cfg]は、環境に応じたコンパイルをする為の属性。

指定 説明
any いずれかが有効なとき有効になる。 #[cfg(any(feature = "a", feature = "b"))]
feature 指定されたフィーチャーのときに有効にする。 featureの例
test テスト用モジュール。 #[cfg(test)]
mod test {}

feature

#[cfg(feature = "フィーチャー名")]は、指定されたフィーチャーのときにコードを有効にする。
(フィーチャーが指定されていないときはコンパイル対象外となる)

指定可能なフィーチャー名はCargo.tomlで定義する。


例えばbigdecimalクレートの有効無効をフィーチャーによって切り替えるには以下のようにfeaturesを定義する。

src/Cargo.toml:

〜
[dependencies]
bigdecimal = { version = "0.4.7", optional = true }

[features]
default = ["with_bigdecimal"]
with_bigdecimal = ["bigdecimal"]

src/main.rs:

#[cfg(feature = "with_bigdecimal")]
fn example() {
    use bigdecimal::*;

    let value = BigDecimal::from_i32(123).unwrap();
    println!("{}", value);
}

fn main() {
    #[cfg(feature = "with_bigdecimal")]
    example();
}

ちなみに、フィーチャーが指定されているかどうかをif文などでチェックしたい場合は、cfg!マクロが利用できる。

fn main() {
    if cfg!(feature = "with_bigdecimal") {
        println!("with_bigdecimal");
    }else{
        println!("no with_bigdecimal");
    }
}

↓実行例

$ cargo run	←defaultフィーチャーが使用される
with_bigdecimal

$ cargo run --no-default-features
no with_bigdecimal

$ cargo run --no-default-features --features "with_bigdecimal"
with_bigdecimal

属性へ戻る / Rustへ戻る / 技術メモへ戻る
メールの送信先:ひしだま