web-dev-qa-db-ja.com

Rustでcfgを使用してリリース/デバッグビルドを確認するにはどうすればよいですか?

Cプリプロセッサでは、これを行うのが一般的です。

_#if defined(NDEBUG)
    // release build
#endif

#if defined(DEBUG)
    // debug build
#endif
_

Cargoのおおまかな同等物は次のとおりです。

  • _cargo build --release_リリース用。
  • _cargo build_デバッグ用。

Rustの#[cfg(...)]属性またはcfg!(...)マクロを使用して同様のことをするにはどうすればよいですか?

RustのプリプロセッサがCのように機能しないことを理解しています。私はドキュメントをチェックしました このページはいくつかの属性をリストしています(このリストが包括的であると想定)

_debug_assertions_はチェックできますが、より一般的なデバッグのケースをチェックするために使用すると誤解を招く可能性があります。

この質問が貨物に関連するべきかどうかわかりません。

35
ideasman42

_debug_assertions_を適切な構成フラグとして使用できます。 #[cfg(...)]属性と_cfg!_マクロの両方で機能します。

_#[cfg(debug_assertions)]
fn example() {
    println!("Debugging enabled");
}

#[cfg(not(debug_assertions))]
fn example() {
    println!("Debugging disabled");
}

fn main() {
    if cfg!(debug_assertions) {
        println!("Debugging enabled");
    } else {
        println!("Debugging disabled");
    }

    #[cfg(debug_assertions)]
    println!("Debugging enabled");

    #[cfg(not(debug_assertions))]
    println!("Debugging disabled");

    example();
}
_

この構成フラグは、これを行うための正しい方法として この説明 と名付けられました。現在のところ、これ以上適切な組み込み条件はありません。

参照 から:

_debug_assertions_-最適化なしでコンパイルすると、デフォルトで有効になります。これは、開発では追加のデバッグコードを有効にするために使用できますが、本番環境では使用できません。たとえば、標準ライブラリの_debug_assert!_マクロの動作を制御します。

もう少し複雑な方法は、#[cfg(feature = "debug")]を使用し、 here のようにクレートの「デバッグ」機能を有効にするビルドスクリプトを作成することです。

29
Pavel Strakhov