#[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