9

私は他の人が作ったC++プログラムに取り組んでいて、このようなDEBUGの多くの使用法を見ました

#ifdef DEBUG
    cout << "Value is "<< value << endl;
#endif

私自身は、裕福なC ++プログラマーになるための学習プロセスにあり、主にVisualStudioとブレークポイントを使用してデバッグしています。したがって、コードをステップ実行して値をデバッグできる場合、これらの種類のマクロを使用する他の理由はありますか?

グーグルしようとしましたが、あまり有用なページが見つかりませんでした。

ありがとう。

4

7 に答える 7

10

コード全体をステップスルーするのではなく、ターミナルの出力を調べるだけの場合もあります。

コードが定義済みでコンパイルされている場合DEBUG、おそらくデバッグビルドで、出力が表示されます。リリースビルドの場合は、そうではありません。プロジェクト設定->構成プロパティ->C/ C ++->プリプロセッサ->プリプロセッサ定義に移動するDEBUGと、デバッグビルド用に定義されていることがわかりますが、リリース用ではありません。(私は実際に持っています_DEBUG

あなたが巨大な関数を持っていて、あなたが興味を持っているのは1000行目であると想像してください(それは古いコードであり、それを変更することはできません)。その厄介なレガシーコードをすべてステップスルーするか、重要なポイントで役立つデバッグステートメントを用意しますか?コンソールがどこで問題が発生したかを教えてくれるのか、それともreturn失敗した場所の237個のステートメントのそれぞれにブレークポイントを設定するのか。

于 2012-05-31T21:25:51.930 に答える
6

デバッグ中は、中間値を画面にダンプするのが一般的です。マウスでの操作に多くの時間を浪費するため、ビジュアル デバッガーが常に役立つとは限りません。

「テキストモードのデバッグ」とログの必要性は、組み込みシステムの経験からも頻繁に発生します。視覚的な支援があまりなく、シリアルポートなどに1バイトまたは2バイトをダンプすることしかできません。重要なデバッグ ポイントをすばやく見つけることに慣れたら、プログラムの正確性をチェックする値を持つ印刷コードをそこに挿入するだけです。

"DEBUG" マクロは、プロジェクトがデバッグ モードでコンパイルされている間に、MSVC++ コンパイラによって定義されます。リリース バージョンを作成している場合、エンド ユーザーにとって実際には役に立たないすべてのコードは、プリプロセッサによって「取り除かれます」。

典型的なスニペット

#ifdef DEBUG
Some code
#endif

DEBUG が定義されていない場合、プリプロセッサによって削除されます。

于 2012-05-31T21:26:57.527 に答える
3

マルチスレッドのバグを特定するには、デバッガーではなくコンソール出力を使用すると便利な場合があります。ブレークポイントを介してプログラムのフローを中断すると、スレッドが互いのつま先を踏むのを防ぐため、バグの発生を防ぐことがよくあります。同じことが他のタイミングベースのバグにも当てはまります。

于 2012-05-31T21:30:39.293 に答える
2

「私は主にVisualStudioとブレークポイントを使用して
デバッグします」動作を段階的に監視してコードをデバッグすることは非常に困難であるか、状況によっては不可能ですらあります。この種の「デバッグ出力」を作成する方が、リアルタイムでステップスルーするのではなく、これらのログから何が起こっているかを確認できるようにする方が簡単な場合があります。

シンボルが定義されているかどうかをチェックDEBUGすることは、リリースバージョンがこの種の出力を行わないことを確認することです。_DEBUGVisualStudioがデバッグ構成を定義していることに注意してください。具体的には、 「/MTdまたは/MDdオプションを指定するタイミングをコンパイラが定義_DEBUGします。これらのオプションは、Cランタイムライブラリのデバッグバージョンを指定します。」NDEBUG定義時にCスタイルのアサーションを無効にする ものもあります。詳細については、_DEBUGとNDEBUGを確認してください。

于 2012-05-31T21:28:36.073 に答える
1

簡単です。「ソフト」デバッグを行うのに役立つメッセージを取得したい場合は、DEBUGとその間の文を定義するだけで#ifdef DEBUG効果#endifがあり、場合によっては有用なメッセージが表示されます。

このように、開発が終了し、リリースを作成したい場合は、デバッグの定義を解除するだけで、メッセージは表示されなくなります。

はいと思うかもしれませんが、それは良い考えですが、アプリのコードが多いですが、良い点は、それらがマクロであり、コンパイル時に評価されることです。したがって、アプリは、それらをすべて削除した場合と同じになります。 )。

于 2012-05-31T21:28:35.950 に答える
1

これはデバッグ用です。プリプロセッサコマンドでコードをラップすることで、そのコードをオンまたはオフにすることができます。

ここを見てください:C ++注:プリプロセッサ

于 2012-05-31T21:26:00.393 に答える
0

DEBUGマクロを使わないことをお勧めします。NDEBUG代わりに、コードのデバッグが必要な場合に定義するのではなく、コードのデバッグが必要ない場合に定義される標準マクロを使用してください。つまり、デフォルトでデバッグ コードをアクティブにします。十分なパフォーマンスを得るためにデバッグ チェックをオフにする必要があるのは、パフォーマンス クリティカルなコードの小さなコアのみであることがわかります。

于 2012-06-07T11:31:28.867 に答える