3

現在、ロギングクラスを作成しています。ロガーはストリームを処理し、現在ログに記録されているオブジェクトも出力します。マクロは次のとおりです。

#define OBJLOG(DL, what) DL <= this->Logger->getDebugLevel() ? *this->Logger << DL << "[" << this->Name << "]: "<< what << std::endl : this->Logger->doNothing();

概要を改善するための擬似コードバリアント:

#define OBJLOG(debuglevel, what) debuglevel <= logger.debuglevel ? logger.log(what) : logger.doNothing()

何もしないなど、doNothing関数呼び出しを回避する方法はありますか?

4

3 に答える 3

4
#define OBJLOG(DL, what) do { if(DL <= this->Logger->getDebugLevel()) *this->Logger << DL << "[" << this->Name << "]: "<< what << std::endl; } while(0)

マクロで明らかに無意味なdo-whileおよびif-elseステートメントを使用する理由を参照してください。説明のために。(ここdo {} while(0)では厳密には必要ありませんが、リークしたくないostreamです。)

また、次のように、マクロ引数の使用を常に括弧で囲む必要があります。

#define OBJLOG(DL, what) do { if((DL) <= this->Logger->getDebugLevel()) *this->Logger << (DL) << "[" << this->Name << "]: "<< (what) << std::endl; } while(0)

最後に、このコードを関数に移動し、マクロでそれを呼び出して(本当にマクロの使用を主張する場合)、マクロ引数を複数回評価しないようにする必要があります。

于 2012-05-02T15:23:46.530 に答える
1
  1. logger.log()関数にブール値を返してもらいます。

  2. 述語を次のように接続します:debuglevel <= logger.debuglevel && logger.log

それでうまくいくはずです。

于 2012-05-02T15:28:57.383 に答える
0

何もしない式が必要な場合は、を試してください(void)0

于 2012-05-02T17:32:45.453 に答える