2

ロギング用の独自の単純なクラスを作成しました。ある種のライブラリ(boost.log、log4cpp?)を使用する方がよいことは理解していますが、とにかく私の単純なクラスについて説明しましょう。

#include "stdafx.h"
#include "Logger.h"


Logger::Logger(std::string fileName)
{
    logFile.open(fileName);
}


Logger::~Logger(void)
{
    logFile.close();
}


void Logger::Error(std::string message) {
    logFile << message << std::endl;
}

void Logger::Debug(std::string message) {
    logFile << message << std::endl;
}
  1. メソッドが可変数の引数を受け入れるようにしたいので、そのようなパラメーターを渡すことができます"Error code: %x", code。どうやってするか?
  2. コンパイルシンボルが設定されていないDebug場合、メソッドを除外したい。LOG_DEBUGC#では[Conditional("LOG_DEBUG")]、メソッド宣言の前に追加できますが、C ++で追加するにはどうすればよいですか?

upd 1に関して私はそれを試しました、そしてそれは働きます:

void Logger::Debug(std::string message, ...) {
va_list arglist;
fprintf(pFile, message.c_str(), arglist);
4

2 に答える 2

5

私の意見では、最も簡単な方法は、これにマクロを使用することです。

#define LOG_DEBUG(logger, output) \
    do { logger.getStream() << "DEBUG: " << output << std::endl; } while (0)

LOG_DEBUG(logger, "Some value = " << some_value);

これにより、すべての通常のC++ストリームマニピュレータを使用できるようになります。


2番目の部分に関しては、それも単純なプリプロセッサのトリックです。

#ifdef DEBUG
# define LOG_DEBUG(logger, output) do { ... } while (0)
#else
# define LOG_DEBUG(logger, output)
#endif
于 2012-11-26T12:11:39.937 に答える
4

メソッドが可変数の引数を受け入れるようにしたいので、「エラーコード:%x」のようなパラメーターを渡すことができます。どうやってするか?

これには2つの解決策があります。

  1. printfのようなフォーマットを使用します。これには、va_list、va_arg、およびva_endマクロを使用する必要があります。

  2. 演算子のオーバーロードを使用します(@Joachimの回答のように)。

LOG_DEBUGコンパイルシンボルが設定されていない場合、Debugメソッドを除外したい。C#では、メソッド宣言の前に[Conditional( "LOG_DEBUG")]を追加できますが、C ++で追加するにはどうすればよいですか?

ロギングマクロは、DEBUGマクロ定義(またはNDEBUGなど)に応じて、2つの異なる方法で定義します。

#ifdef DEBUG
#define LOGE(X) Logger::Error(X)
#define LOGD(X) Logger::Debug(X)
#else
#define LOGE(X) 
#define LOGD(X) 
#endif
于 2012-11-26T12:56:09.343 に答える