gpt4 book ai didi

c++ - 编写用于日志记录的宏

转载 作者:太空狗 更新时间:2023-10-29 20:45:36 24 4
gpt4 key购买 nike

我目前正在编写一个日志类。 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 函数调用,就像什么都不做一样吗?

最佳答案

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com