我现在正在写一个日志类。 Logger 处理流并打印当前正在记录的对象。这是宏:

#define OBJLOG(DL, what) DL <= this->Logger->getDebugLevel() ? *this->Logger << DL << "[" << this->Name << "]: "<< what << std::endl : this->Logger->doNothing();
伪代码 Variant 以获得更好的概览:
#define OBJLOG(debuglevel, what) debuglevel <= logger.debuglevel ? logger.log(what) : logger.doNothing()
有什么办法可以绕过 doNothing 函数调用,比如什么都不做?

最佳答案

#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)

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

关于c++ - 编写用于日志记录的宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10416738/

10-11 22:59