2015-04-12 102 views
0

语境

我书面方式调试类Qt中的一个项目,我想知道在哪个班,我所以现在我写:获取类的名字调用函数

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

编辑:DEBUG_IN()DEBUG_OUT()是全局函数。他们不是MyClass类的一部分

问题

是否有可能获得其中DEBUG()被调用的类的名字吗?

(何DEBUG()被调用函数的bame?)

,这样我可以只是做:

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

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

THX很多

+0

试试看http://stackoverflow.com/questions/1666802/is-there-a-class-macro-in-c。如果您不熟悉宏观扩展如何工作,我可以尝试为您澄清。 – Qartar

+0

@qartar:您给了我与其他两个命题相同的答案,但是我的DEBUG()不是MyClass的一部分(我刚刚编辑了这个问题,因为它不够清楚) – ochurlaud

+0

您可以将扩展的宏直接传递给功能。例如'DEBUG_IN(__ PRETTY_FUNCTION__,...)' – Qartar

回答

2

确实有。

typeid(*this).name() 

会给你一个可读的类名。没有指定这个名字是如何构造的,所以你的编译器可能不会给出确切的类名,但它应该适合调试目的。

由于DEBUG_IN和DEBUG_OUT是您需要将类类型作为参数传递的自由函数。一个简单的模板应该做的窍门

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

} 
+0

问题在于它只给出了我在DEBUG_IN中的名字,而不是从DEBUG_IN被调用的类中。我刚编辑我的问题,因为它不清楚,似乎 – ochurlaud

+0

你将如何使用DEBUG_IN()?你永远不得不在参数中加入'this'是不是你? – ochurlaud

+0

@ochurlaud是的。 –

2

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

编辑:

你应该使用这样的:

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

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

+0

问题是,它只给出了我在DEBUG_IN中的名字,而不是从DEBUG_IN被调用的类中。查看我的编辑 – ochurlaud

+0

您可以更改DEBUG_ *函数的定义吗? –

+0

@CaptainGiraffe是的,我可以。一个主意?否则,我可以随意复制粘贴DEBUG(typeid(* this).name(),“function1()”),但我希望能够获得更多时间:) – ochurlaud