1. ホーム
  2. debugging

[解決済み] Rustのcfgを使用してリリース/デバッグビルドを確認するには?

2023-01-18 22:55:11

質問

Cプリプロセッサーで、よくあることです。

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

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

カーゴの大まかな等価物は

  • cargo build --release をリリースします。
  • cargo build デバッグ用。

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

RustのプリプロセッサはC言語のように動作しないことは理解しています。ドキュメントを確認したところ このページにはいくつかの属性が記載されています . (このリストが包括的であると仮定して)

debug_assertions はチェックすることができますが、より一般的なデバッグの場合のチェックに使用すると誤解を招く可能性があります。

この質問がCargoに関連すべきものなのかどうか、よくわかりません。

どのように解決するのですか?

あなたは 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")] を使用して、次のように crate に対して "debug" 機能を有効にするビルド スクリプトを作成することです。 ここで .