3

我现在正在写一个日志类。Logger 与流一起工作,还打印当前正在记录的对象。这是宏:

#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 回答