注意: 最新版のドキュメントをご覧ください。この第1版ドキュメントは古くなっており、最新情報が反映されていません。リンク先のドキュメントが現在の Rust の最新のドキュメントです。
Rustには #[cfg] という特別なアトリビュートがあり、
コンパイラに渡されたフラグに合わせてコードをコンパイルすることを可能にします。
#[cfg] アトリビュートは以下の2つの形式で利用することができます:
#[cfg(foo)] #[cfg(bar = "baz")]
また、以下の様なヘルパが存在します:
fn main() { #[cfg(any(unix, windows))] fn foo() {} #[cfg(all(unix, target_pointer_width = "32"))] fn bar() {} #[cfg(not(foo))] fn not_foo() {} }#[cfg(any(unix, windows))] #[cfg(all(unix, target_pointer_width = "32"))] #[cfg(not(foo))]
ヘルパは以下のように自由にネストすることが可能です:
fn main() { #[cfg(any(not(unix), all(target_os="macos", target_arch = "powerpc")))] fn foo() {} }
#[cfg(any(not(unix), all(target_os="macos", target_arch = "powerpc")))]
このようなスイッチの有効・無効の切り替えはCargoを利用している場合 Cargo.toml 中の [features] セクション で設定できます。
[features]
# no features by default
default = []
# フィーチャ「secure-password」は bcrypt パッケージに依存しています
secure-password = ["bcrypt"]
もしこのように設定した場合、Cargoは rustc に以下のようにフラグを渡します:
--cfg feature="${feature_name}"
渡されたすべての cfg フラグによってどのフラグが有効に成るか決定され、
それによってどのコードがコンパイルされるかも決定されます。以下のコードを見てみましょう:
#[cfg(feature = "foo")] mod foo { }
もしこのコードを cargo build --features "foo" としてコンパイルを行うと、
--cfg features="foo" が rustc に渡され、出力には mod foo が含まれます。
もし標準的な cargo build でコンパイルを行った場合、rustc に追加のフラグは渡されず foo モジュールは存在しない事になります。
また、cfg_attr を用いることで、cfg に設定された値によってアトリビュートを有効にすることができます:
#[cfg_attr(a, b)]
このようにすると、cfg アトリビュートによって a が有効になっている場合に限り #[b] と設定されている
場合と同じ効果が得られます。
cfg! 拡張構文 は以下のようにコード中でフラグを利用することを可能にします:
if cfg!(target_os = "macos") || cfg!(target_os = "ios") { println!("Think Different!"); }
このようなコードは設定に応じてコンパイル時に true または false に置き換えられます。