今はロギングクラスを書いています。 Loggerはストリームで動作し、同時にロギングしているオブジェクトを出力します。ここではマクロは次のとおりです。ロギングのためのマクロを書く
#define OBJLOG(DL, what) DL <= this->Logger->getDebugLevel() ? *this->Logger << DL << "[" << this->Name << "]: "<< what << std::endl : this->Logger->doNothing();
より良い概要については、擬似コードvarientの:
#define OBJLOG(debuglevel, what) debuglevel <= logger.debuglevel ? logger.log(what) : logger.doNothing()
全く何もしないように、doNothing関数呼び出しを回避する方法はありますか?前もって感謝します。
こんにちは、あなたの答えに感謝します。私はあなたが関数呼び出しにそれを移動することについて書いた最後の部分を取得しません。しかし、それは今試してみて、それを働かせる方法を見てください。 – roohan
'what'パラメータの周りにカッコを置かない*かもしれません。マクロ呼び出しの考えられる構文を変更します。かっこなしでは、OBJLOG(0、 "x:" << x << "; y:" << y ")を呼び出すことができます。括弧を使用すると、(文字配列をシフトできないため)マクロ展開で構文エラーが発生します。 –
マクロ引数が複数回展開された場合、式に副作用がないことを期待しています(つまり、数えないでください)。例えば。 'OBJLOG(-i?DEBUG:WARN、" foo ")'は 'i'を2回減らします。 (これは人為的な例ですが、マクロを書くときには注意してください) – Electro