我有一个记录器类。将其命名为 MyLogger
。我可以在这样的函数中使用它:
void MyFunc(MyLogger& oLogger)
{
//Do stuff
oLogger.Log("In MyFunc : Some Error");
//Do something else
oLogger.Log("In MyFunc : Some other error");
}
现在,如果日志来自 MyFunc
,我想在日志前添加 "In MyFunc"
。同样对于其他功能...
因为这很烦人,所以我尝试了这样的事情:
void MyLogger::PushPrependString(const char*)
{
//Store prepend string in stack and set it as current prepend string.
}
void MyLogger::PopPrependString()
{
//Pop the most recent prepend string.
}
现在,我可以像这样使用这两个函数:
void MyFunc(MyLogger& oLogger)
{
oLogger.PushPrependString("In MyFunc : ");
//Do stuff
oLogger.Log("Some Error");
//Do something else
oLogger.Log("Some other error");
oLogger.PopPrependString();
}
麻烦的是,如果一个函数中有多个return
,这会变得很难看。有没有办法解决?这是个常见的问题吗?是否有像 __FILE__
或 __LINE__
这样的预处理器宏来获取一行出现的函数的名称?如有任何意见,我们将不胜感激。谢谢。
最佳答案
“问题是,如果一个函数中有多个返回值,这会变得很难看。有什么办法解决这个问题吗?”
是的,只需使用带有构造函数(调用 PushPrependString)和析构函数(调用 PopPrependString)的对象即可。
class LogPrefix
{
private:
MyLogger* logger_;
LogPrefix( LogPrefix const& ); // No such.
LogPrefix& operator=( LogPrefix const& ); // No such.
public:
LogPrefix( MyLogger& logger, char const s[] )
: logger_( &logger )
{
logger_->PushPrependString( s );
}
~LogPrefix()
{
logger_->PopPrependString();
}
};
免责声明:现成的代码,未经编译器之手...
“这是一个常见问题吗?”
是的。
“是否有像 FILE 或 LINE 这样的预处理器宏来获取一行出现的函数的名称?”
C++98 中没有。各种编译器提供了各种扩展来做到这一点。 IIRC C++0x采用了C99方案,遗憾的是只提供了静态字符串。
干杯。
关于c++ - 在函数入口处将字符串添加到记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4039868/