我正在写一个日志类。 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函数调用,比如什么都不做?提前谢谢。
答案 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)
让你的logger.log()函数返回一个布尔值。
使用以下内容连接您的谓词:debuglevel&lt; = logger.debuglevel&amp;&amp; logger.log
这应该可以解决问题。
答案 2 :(得分:0)
如果您希望表达式不执行任何操作,请尝试(void)0
。