编写用于记录的宏

时间:2012-05-02 15:21:54

标签: c++

我正在写一个日志类。 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函数调用,比如什么都不做?提前谢谢。

3 个答案:

答案 0 :(得分:4)

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

有关说明,请参阅Why use apparently meaningless do-while and if-else statements in macros?。 (此处do {} while(0)并非绝对必要,但我不希望泄漏ostream。)

此外,您应始终在括号中包含宏参数,例如:

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

最后,您应该将此代码移动到一个函数中,并在宏中调用它(如果您真的坚持使用宏),以避免多次评估您的宏参数。

答案 1 :(得分:1)

  1. 让你的logger.log()函数返回一个布尔值。

  2. 使用以下内容连接您的谓词:debuglevel&lt; = logger.debuglevel&amp;&amp; logger.log

  3. 这应该可以解决问题。

答案 2 :(得分:0)

如果您希望表达式不执行任何操作,请尝试(void)0