c++ - 在函数入口处将字符串添加到记录器

标签 c++

我有一个记录器类。将其命名为 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();
    }
};

免责声明:现成的代码,未经编译器之手...

“这是一个常见问题吗?”

是的。

“是否有像 FILELINE 这样的预处理器宏来获取一行出现的函数的名称?”

C++98 中没有。各种编译器提供了各种扩展来做到这一点。 IIRC C++0x采用了C99方案,遗憾的是只提供了静态字符串。

干杯。

关于c++ - 在函数入口处将字符串添加到记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4039868/

相关文章:

c++ - 是否有(足够快的)解决方法来乘以超出内存限制的矩阵?

c++ - isPrime 函数的改进

c++ - 所有 CC_CALLBACK_# 宏之间有什么区别?

c++ - 居民纹理?

c++ - c++ 哈希函数对密码来说是否相当安全?

c++ - (QT C++) 基于 slider /拨号值的动画 GIF

c++ - 用 protobuf 枚举替换 C++ 枚举

c++ - 如何在输入行上方输出?

C++:继承同名的重载非虚方法和虚方法会导致问题

c++ - Xamarin:如何在简单的 C++ 项目中设置断点?