5

在linux上專門使用g ++,有沒有一種方法可以確定爲特定語句選擇了哪個重載或模板函數?可以編譯器告訴我它選擇了哪個重載或模板函數?

具體而言,我不認爲我不一定知道所有的可能的選擇,這可能是在頭文件中的各種庫的到來。即使我這樣做了,我也不認爲我可以修改相關的代碼。

+0

http://stackoverflow.com/questions/1496497/how-can-i-see-parse-tree-intermediate-code-optimization-code-and-assembly-code可能是有用的 - 即,看看中間編譯器的步驟。如果你只想做一次這樣的事情,你可以看看生成的目標文件,也可以圍繞你想要了解的呼叫貼上一個「標記」函數調用。目標文件將指出它調用的函數的符號名稱,它可以被重新引用到您調用的函數簽名中(它應該是唯一的)。 – Yakk

+5

我經常說我們需要的是一個編譯時調試器,以便您可以在模板實例化過程中逐步進行評估,查看模板參數等,以查看實際情況。 –

+0

當你說*看*時,你的意思是什麼? Clang因爲爲C++生成完全形成的AST而臭名昭着,但是您需要圍繞其庫編寫一個程序才能「看到」。 –

回答

1

我不知道直接做這件事的方法。

最簡單的辦法是設置在調用點和單步成任何函數被調用斷點;那麼你的調試器可以告訴你哪個函數你是。

一個IDE像Eclipse CDT能做超載和模板決議本身(如果一切正常,右),那麼右鍵點擊一個函數調用,並打算在函數聲明會帶你去適當的功能。

通過故意創建一個模糊的函數調用,如this answer中所述,您可以獲取所有可用重載和模板的列表,並且可能會找出哪一個被調用。

如馬修M.說,鏘可以dump its AST。這需要一些解釋,但它可以幫助你找出哪個函數被調用。

+0

謝謝。如果Eclipse真的能做到這一點,我印象深刻,這將是一個不錯的解決方案。 –

+0

@ c-urchin - 讓Eclipse正確識別各種源文件和頭文件可能會非常棘手,特別複雜的C++代碼很難將其混淆,但一旦它運行起來就非常好。 –

+0

@ c-urchin - MS VS也可以做到這一點。將鼠標光標移至功能名稱,您可以看到呼叫超載功能的名稱和超載功能的數量。我認爲任何現代IDE都必須這樣做。 – SergV

1

部分答案。

可以使用非標準的宏在運行時(Macro/keyword which can be used to print out method name?

對於GNU C++打印的函數名稱:

從這個代碼( http://ideone.com/PI39qK
#include <iostream> 
using namespace std; 
template <typename T> 
void f(const T & t) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
void f(const string &) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
void f(int) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
int main() 
{ 
    f(1.0); 
    f(1); 
    f(string("sss")); 
    string a; 
    f(a); 
} 

輸出:

void f(int) 
void f(int) 
void f(const std::string&) 
void f(T&) [with T = std::string] 
+0

謝謝,但正如我所說,我不能假定我可以修改源代碼,或者我甚至知道哪些代碼可能是候選人,因爲它可能來自任何#include文件(在任何級別) –

相關問題