1

私の C# プロジェクトでは、使用するのが好きConditionalAttributeで、非常に便利です。ロギング用のクラスがたくさんあり、対応する条件属性を設定または設定解除して再コンパイルするだけで、ロギングをオンまたはオフにできます(オーバーヘッドなし)。

// this code likely is not good as HedgerControllerLogger better to be singleton
// please ignore that

public class HedgerControllerLogger
{
    private StreamWriter swLog;

    public HedgerControllerLogger()
    {
        swLog = new StreamWriter("logsGeneral/logHedgerController.txt") { AutoFlush = true };
    }

    [Conditional("LOG_HEDGER_CONTROLLER")]
    public void Log(string message)
    {
        swLog.WriteLine(DateTimePrecise.Instance.CurDateTime().ToString("H:mm:ss:ffffff") + ' ' + message);
    }

}

c ++で同じ効果を得るにはどうすればよいですか? 似たようなものを使用する必要がありますか?おそらく、既存のロギング ライブラリのいくつかは同じ機能を持っているのではないでしょうboostか? ありがとう!

4

2 に答える 2

1

プリプロセッサを使用できます:

#ifdef ENABLE_LOGGING
  void log(const std::string& message) { /* do logging*/}
#else
  void log(const std::string&){}
#endif

テンプレートで同様のことを行うこともできますが、なぜ複雑すぎるのでしょうか?

于 2013-04-24T16:00:19.847 に答える
0

同様のマクロがどのようTRACE/ATLTRACEに提供されているかを確認することをお勧めします (私が正しければ、Visual Studio を使用しています)。一般に、DEBUG ビルドではトレース呼び出しが行われ、RELEASE ビルドでは何も行われません。次に例を示します。

struct CTrace
{
    static void CTrace::Trace(LPCTSTR lpszFormat, ...)
    {
        va_list args;
        va_start(args, lpszFormat);
        TCHAR szBuffer[1024];
        int nSize = sizeof(szBuffer)/sizeof(szBuffer[0]);
        int nBuf = _vsntprintf(szBuffer, nSize, lpszFormat, args);          
        OutputDebugString(szBuffer); // write to debug output
        va_end(args);
    }    
};

#ifdef _DEBUG   
#define TRACE               CTrace::Trace
#else  
#define TRACE               true ? (void)0 : CTrace::Trace
#endif // _DEBUG

次に、コードには次のようなものがあります。

TRACE("value is %d", 34);

DEBUG ビルドでは、これは次のようにコンパイルされます。

CTrace::Trace("value is %d", 34);

リリース ビルドでは、次のようになります。

true ? (void)0 : CTrace::Trace("value is %d", 34);

その後、コンパイラによって最適化されます。生成されたコードを調べることで確認できます。

于 2013-04-24T16:41:03.013 に答える