#[cfg]は、環境に応じたコンパイルをする為の属性。
指定 | 説明 | 例 |
---|---|---|
any |
いずれかが有効なとき有効になる。 | #[cfg(any(feature = "a", feature = "b"))] |
feature |
指定されたフィーチャーのときに有効にする。 | →featureの例 |
test |
テスト用モジュール。 | #[cfg(test)] |
#[cfg(feature = "フィーチャー名")]は、指定されたフィーチャーのときにコードを有効にする。
(フィーチャーが指定されていないときはコンパイル対象外となる)
指定可能なフィーチャー名はCargo.tomlで定義する。
例えばbigdecimalクレートの有効無効をフィーチャーによって切り替えるには以下のようにfeaturesを定義する。
〜 [dependencies] bigdecimal = { version = "0.4.7", optional = true } [features] default = ["with_bigdecimal"] with_bigdecimal = ["bigdecimal"]
#[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