获取调用函数的 class 的名称

Get the name of the class calling a function

上下文

我正在为一个项目在 Qt 中编写调试 class,我想知道我在哪个 class 所以现在我写:

MyClass::function1()
{
   DEBUG_IN("[MyClass] Enters function1()")
   ....do something
   DEBUG_OUT("[MyClass] Exits function1()");
}

编辑: DEBUG_IN()DEBUG_OUT() 是全局函数。它们不属于 class MyClass

问题

是否可以获取调用 DEBUG() 的 class 的名称?

(以及调用 DEBUG() 的函数的名称?)

这样我就可以做到:

MyClass::function1()
{
   DEBUG_IN("function1()")
   ....do something
   DEBUG_OUT("function1()");
}

DEBUG_IN(QString text)
{
   qDebug() << qPrintable("[")
            << qPrintable(getClassName())
            << qPrintable("] Enters ")
            << qPrintable(text);
}

非常感谢

最接近您想要的是 __PRETTY_FUNCTION__。这包括完全限定的函数名称和签名。

编辑:

你应该这样使用它:

#define DEBUG_IN_PRETTY(...) DEBUG_IN(__PRETTY_FUNCTION__, __VA_ARGS__)

然后调用DEBUG_IN_PRETTY(显然DEBUG_IN需要额外的参数)。这将在调用站点展开宏。

确实有。

typeid(*this).name()

会给你一个可读的class名字。未指定此名称的构造方式,因此您的编译器可能不会给出确切的 class 名称,但它应该有助于调试目的。

由于 DEBUG_IN 和 DEBUG_OUT 是自由函数,您需要将 class 类型作为参数传递。一个简单的模板就可以解决问题

template<typename CLASSNAME>
void DEBUG_IN(QString msg, CLASSNAME* that)
{
   ...  typeid(*that).name()

}