#ifdef _DEBUG
はコンパイル時 (実際には前処理時) の構造であり、デバッガー内でプログラムを実行しているかどうかには関係ありませんが、_DEBUG
マクロが定義されているという事実に関係しています。
通常、少なくとも 2 つのビルド オプションのセットがあります。1 つはデバッグ用 (を定義し_DEBUG
、いくつかのコンパイラの最適化を無効にし、デバッグ シンボルを生成します)、もう 1 つはリリース用 (を定義せず_DEBUG
、関連するすべてのコンパイラの最適化を有効にし、生成しない可能性があります) です。情報をデバッグするか、別のファイルに生成します)。
プログラムを開発するときは、通常、デバッグ構成を使用します。実行可能ファイルをビルドして最終的に展開/日常の使用に実際に使用するときは、#ifdef _DEBUG ... #endif
ブロックに含まれるコードを含まないリリース構成を使用します。実行可能ファイルがいずれかの構成で生成されると、コンパイル時に定義されたという事実が_DEBUG
実行可能ファイルに「石で書かれています」。
そうは言っても、デバッガーが接続されているかどうかを検出するプラットフォーム固有の方法がありますが、通常は、デバッガーが接続されているかどうかに応じてプログラムの動作を変更すると、デバッガーを使用する目的が無効になる可能性があります。
補遺
わかりましたので、完全に理解できるかどうか見てみましょう。したがって、f5 キーを押してデバッグ ビルドを実行すると、この #ifdef _DEBUG 内にあるものはすべて実行され、ctrl + f5 キーを押してリリース モードで実行すると、#ifdef _DEBUG 内のコードは実行されません。自分。私はあなたが言おうとしていることを完全に理解しているとは思いません。できればもう少し簡単に説明してみてください。私は、c++ と Visual Studio 環境についてはそれほど詳しくありません。
C++ でビルド/デバッグ プロセスがどのように行われるかについて、誤解があるようです。を押すと、次F5のことが起こります。
- コンパイラが呼び出されます。現在選択されている構成のビルド設定に従って、ファイルをコンパイルし、実行可能ファイルを生成します。1
- 実行可能ファイルが実行されます。
- VS デバッガーは、新しく作成されたプロセスに接続されます2。
Ctrl+を押すF5と、唯一の違いはステップ 3 がスキップされることです。残りはまったく同じです。
さて、いつ_DEBUG
登場しますか?実行可能ファイルが生成されるステップ 1 (実際には、ステップ 1 のかなり早い段階、前処理段階)。デバッガーが接続されているかどうかにかかわらず、違いはありません。#ifdef _DEBUG
ブロックに入れられた命令は、実行可能ファイルから既に書き込まれています (または除外されています)。
ここでの重要なポイントは、F5/ Ctrl+F5とデバッグ/リリース構成は 2 つの直交する設定であるということです。「デバッグ」実行可能ファイルをビルドしてデバッグなしで開始し、「リリース」実行可能ファイルをビルドしてデバッグを開始できます (実際、これは最適化されたビルドでのみ発生する問題をデバッグするためによく行われます)。デバッガーがプログラムに接続されているという事実は、その動作をまったく変更するべきではありません3。
繰り返しになりますが、デバッガーを使用して開始するかどうかは、この実行でデバッガーを接続するかどうかに関係し、デバッグ/リリース構成でビルドすることは、実行可能ファイルが実際にどのようにビルドされるかに関係します (デバッグ構成は、より多くの「debug-フレンドリー」設定 -_DEBUG
デバッグ コードを有効にする、assert
s を有効にする、最適化を無効にする、デバッグ シンボルを有効にするなどのように定義されています。
ノート
- 以前のビルドからの再利用可能な出力がある場合、このステップはスキップまたは短縮されます。
- 実際には、プロセスはデバッガーが接続された状態で作成されます。これは微妙な問題を引き起こす可能性がありますが、ここでは関係ありません。
- 実際には、プロセスが を使用してデバッガーをチェックできるため、デバッガーがその動作を変更する場合がありますが
IsDebuggerPresent
、通常は上記の理由からそうしたくないでしょう。