2015-04-12 69 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