2011-06-20 19 views
2

デバッグモードを設定して、デバッグモードがオンの場合にのみログステートメントを出力するようにしたいと思います。たとえば、このようなコードがある場合C++でデバッグモードを設定するには

printf("something \n"); 
. 
. 
. 
perror("something \n"); 

これは、デバッグフラグがオンの場合にのみ機能します。「if」ステートメントを使用したくありません。 私は、一般の人々はロガークラスや関数を作る特定のライブラリやソリューションに行くなければ

+2

エラーレベルのログフレームワークが必要です。 – Armando

+0

特定のコンパイラ/プラットフォームですか? –

答えて

5

..

感謝事前..ですこの使用の#defineや何かをする巧妙な方法があると思うし、単一のデバッグフラグ。デバッグ関数はprintfまたはcoutを呼び出す前にこのフラグをチェックします。その後、残りのコードでは、単にデバッグ関数/メソッドを呼び出します。ここで

は例です:もちろんの

class MyDebugger 
{ 
    private: 
     bool m_debug; 

    public: 
     MyDebugger(); 
     void setDebug(bool debug); 
     void debug(const char* message); 
}; 

MyDebugger::MyDebugger() 
{ 
    m_debug = false; 
} 

void MyDebugger::setDebug(bool debug) 
{ 
    m_debug = debug; 
} 

void MyDebugger::debug(const char* message) 
{ 
    if(m_debug) 
    { 
     cout << message << endl; 
    } 
} 

int main(int argc, char** argv) 
{ 
    MyDebugger debugger; 
    debugger.debug("This won't be shown"); 
    debugger.setDebug(true); 
    debugger.debug("But this will"); 

    return 0; 
} 

これは非常に単純な実装です。実際のロガークラスでは、メッセージの重要度を区別するための詳細(メッセージのレベル(エラー、警告、情報、デバッグなど)のレベルを細かく制御するための多くのレベルがあります。また、stdoutだけでなくファイルにもログすることができます。それでも、これはあなたに一般的な考えを与えるはずです。 GCCで

+0

不要なランタイムペナルティを招きます。 – Ajay

+0

@Ajay:あなたは、プログラムがデバッグレベルを先験的に知っていると仮定しているようです。常にそうであるとは限りません。また、それはロガーです。毎秒何百万回も呼び出すのであれば、それは正しいことではありません。パフォーマンスはそれほど重要ではありません。 –

+0

@Ajay:あなたはそれを知らない。計算上の負担となるためには、ロガーは毎秒何回も何回も呼び出さなければならないでしょう。パフォーマンスモニタは、通常、ロギングが無効になっているときに、レーダー上のブリップとしてロギング機能を表示しません。ロギングにはペナルティがありますが、それは実行時のものではなく、人間のペナルティです。 1秒間に何千もの行が生成されたログファイルを巡回する必要はありません。ログファイルは低頻度イベント用です。クリスが言ったように、パフォーマンスはそれほど重要ではありません。 –

2

、非デバッグを

#define debugprint(...) printf(__VA_ARGS__) 
8
#ifdef _DEBUG // or #ifndef NDEBUG 
#define LOG_MSG(...) printf(__VA_ARGS__) // Or simply LOG_MSG(msg) printf(msg) 
#else 
#define LOG_MSG(...)      // Or LOG_MSG(msg) 
#endif 

のようなものは何にもyeildうLOG_MSGを構築しました。 raw printfで定義するのではなく、カスタムロギング関数やクラスメソッドを呼び出すことができます。

+0

_DEBUGはブール型変数である必要がありますか? – codereviewanskquestions

+0

VC++ _DEBUGは、デバッグビルドをビルドするときに定義されます。それ以外の場合は未定義です。 NDEBUGはGCC/NetBeans向けです。これらのマクロは#defineまたは#define(通常は1)のいずれかです。これらはマクロであり、変数ではありません。 – Ajay

0

静的なグローバル変数である可能性のあるデバッグレベルのチェックを使用して、printfを実行する単純なCスタイルのマクロ定義(特に可変引数マクロを実行するのに十分な近代的コンパイラ(gccまたはVS2005 +など) @Chrisが示唆しているようなC++スタイルのクラスを使用する場合は、ロギング機能を呼び出す際に時間を無駄にしないように、ロギング機能をインラインにします。

+0

Re:ロギング機能をインラインで使用すると、ロギングが無効になっても機能を呼び出す時間が無駄にならなくなります。どうして?これは時期尚早の最適化の場合です。コンパイルされたコードとスクリプティング言語の融合により、問題を攻撃する現代的なアプローチを考えると、すぐに返される関数呼び出しのコストはごくわずかです。 –

+0

さて、私は何かがこの時点で(C#/ Java/Python/Rubyとは対照的に)C++で書かれていると、パフォーマンスが重要であると仮定しています。もちろん、ログにも依存します。たとえば、受信したすべてのパケットを記録する場合は、インライン化のメリットがあります。 –

+0

@MKLあなたはそれだけを考えてみましょう:受信したすべてのパケットを記録します。これらの関数をインライン化すると、メリットはありません。ケース1、ロギングが有効です。ここでは、ログファイルメッセージの作成と印刷は、関数呼び出しのコストを犠牲にします。ケース2では、そのようなロギングは無効になっています。もう一度、パフォーマンスは非要因です。これらのパケットのパケット処理は、何もしないロギング機能への呼び出しのコストを犠牲にします。どちらの場合でも、間違った音節に重点を置いています。時期尚早の最適化は悪い考えです(続き)。 –

関連する問題