2011-06-24 9 views
4

私は自分のサーバー上のログシステムを作成するためのサンプルコードを見て...そして私はこのDEBUGはコード内でどこに定義されていますか?

#if DEBUG 
printf("something here"); 
#endif 

が、私はそれが何を知っていました。 DEBUGがdefiendされている場合にのみ、何かをprtinsします。しかし、DEBUGはどこで定義されていますか?私はすべてのヘッダーファイルを見ましたが、DEBUGを見つけることができませんでした。

また、ロギングシステムの設計に関する良い例やチュートリアルを教えてください。 Visual Studioで

事前に感謝..

+0

第2の部分は、第1の部分とは関係がなく、別個の質問に属し、既に尋ねられている/回答されている可能性が最も高い。 – Xeo

+6

は、 'make'ファイルか、g ++のコンパイル時フラグ' -DDEBUG'に入っています –

+0

makeファイルに-DDEBUGがありますが、これはCFLAGS:= -DDEBUG = 1のようなものです。 -DDEBUGとは何ですか? DEBUGを1に設定していますか?言い換えれば、私は何か-DDEBUG2 = 1ならDEBUG2も1に設定しますか? – user800799

答えて

4

少なくとも私が知っているコンパイラには、コンパイル済みファイルの「外部」からプリプロセッサマクロを定義するオプションがあります。

たとえば、MicrosoftのコンパイラでDEBUGを定義するために、あなたは

cl -DDEBUG file.cpp ... 
+0

正確に。これは、DEBUGマクロを設定する通常の位置です。デバッグを有効/無効にするためだけにソースを変更する必要はありません。 –

1

、あなたはプロジェクトのプロパティでプリプロセッサシンボルを設定することができます。ログシステムについては、こちらをご覧ください。log4cpp

2

最初の定義の位置を簡単に検出するには、#defineを追加します。

#include "someone.h" 

#define DEBUG "dummy" // add this 

#if DEBUG 
printf("something here"); 
#endif 

あなたは

foo.c:2:0: warning: "DEBUG" redefined 
<command-line>:0:0: note: this is the location of the previous definition 

それとも

foo.c:30:0: warning: "DEBUG" redefined 
someone.h.c:2:0: note: this is the location of the previous definition 

別の答えを得るでしょう、ctagsのを使用するようにしてください。 ctasg -Rをプロジェクトディレクトリの最上部に実行し、vim /path/to/your/code.cを実行します。カーソルをDEBUGに移動し、CTRL-]と入力します。

このように、いくつかの定義があります。 DEBUGには:tselectですべてを見つけることができます。

4

のようなものDEBUGは、それがC++標準で定義されていない定義で使用しないでくださいといいと思います。 C++標準では標準assertマクロに使用されているNDEBUG(DEBUGなし)が定義されています。ロギングコードはそのコードと同じです。 DEBUGはコンパイラに依存します。したがって、標準ではNDEBUGが適切に設定されています。あなたの例の使用にそれを適用する:

#ifndef NDEBUG 
printf("something here"); 
#endif 

しかし、私の意見は次のとおりです。あなたはNDEBUG/DEBUGペアの周りのロギングライブラリを設計するべきではありません。コードの再コンパイルの必要なしにアプリケーションの動作を追跡できるようにするために、ロギングlibが常に存在している必要があります。コードの新規デプロイメントとバグが発生する可能性があります。ロギングライブラリの設計についてペトルMargineanによって、次のDDJの記事は、C++で非常に効率的な方法でその事実を確保する方法について説明します。

パート1:http://drdobbs.com/cpp/201804215

パート2:http://drdobbs.com/cpp/221900468

のロギングライブラリについて

http://boost-log.sourceforge.net/libs/log/doc/html/index.html


:でブーストロギングライブラリを見てみましょう

NDEBUGがコマンドラインで明示的に定義されていないと設定されていないので、私はdownvotedされました。私はその事実に同意しますが、ここで私はこの質問を理解するので、デバッグモードでのコンパイルでもログ出力が生成されるはずです。この事実は、振る舞いをNDEBUGの存在に束ねるときに、より強く適用されるでしょう。

+0

Downvotedの理由:(1)DEBUGの使用には何も問題ありません。 (2)CもC++もNDEBUGを設定しません。 /は、外部から定義されている(または定義されていない)NDEBUGに依存します。 (3)NDEBUGは、assert()と組み合わせる標準によって特に参照されるため、この種のデバッグメッセージにNDEBUGではなく別の名前を使用することが最善です。 DEBUGはその名前の非常に良い候補です。 –

+2

私はあなたに同意しない。ビルドプロセスは通常、NDEBUGが正しく動作するように編成されます。そうしないと、アサーションマクロは役に立たなくなります。 – ovanes

関連する問題