2010-11-22 12 views
0

しばらく私は以下のようなものを使ってデバッグを行ってきました。カスタムデバッグprintf実行時に使用

#ifdef DEBUG 
#  define Log(fmt, ...) printf(("[%s:%d] %s: " fmt "\n"), __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); 
#else 
#  define Log(...) 
#endif 

これは正常に動作し、そのような私はg++ -DDEBUG=1のようなものを使ってコンパイルするとき、私は私が期待するすべての印刷物を得ること。

クライアント側のコードを複雑にすることなく(または実際には全く変更せずに)、ビルド時間(たとえば./myprocess -d)ではなくランタイムコマンドでこのデバッグを行うことができます。

答えて

2

なぜ簡単なのですか?

extern boolean GLOBAL_LOGGING_ENABLED = false; // you'll need a single definition in any .cpp 
#define LOG(fmt, ...) if (GLOBAL_LOGGING_ENABLED) {printf(// etc etc 

// at startup read command line and set the flag to true if asked for 

または類似のもの。

+1

「GLOBAL_LOGGING_ENABLED」などの場合は#define LOG(etc ...)を、その他の場合は{0}「 – lijie

+0

Bingo」のように定義ガードを使用することをお勧めします。ファイルが複数の場所に含まれている場合、ブールが静的である必要があることだけです。ありがとう。 – Ternary

+0

プログラムごとに1つのインスタンスが必要です。すべての.c/.cpp +中の一つの単一定義(暗黙的なexternリンケージ)。 '#define'と同じ場所に.hの' extern'を使った宣言。 .hで 'static 'と定義すると、各コンパイルユニットがコピーを受け取ることになります。グローバル変数のリンケージ指定子としての 'static'は「この変数をこのモジュールの外部にリンクしない」ことを意味します。明快に私の記事を編集しました。 – Kos

3

実行時に抽象クラスLoggerを宣言し、適切な実装(Loggerの子)を作成する必要があります。

+0

はい、それは現代的ですばらしいアプローチですが、私は最も簡単な答えを探していました。 – Ternary

+0

それは難しいことではありません。それほど現代的ではありません:-)それは試してみてください、あなたは何かを学ぶかもしれません。 – TonyK

関連する問題