在linux上專門使用g ++,有沒有一種方法可以確定爲特定語句選擇了哪個重載或模板函數?可以編譯器告訴我它選擇了哪個重載或模板函數?
具體而言,我不認爲我不一定知道所有的可能的選擇,這可能是在頭文件中的各種庫的到來。即使我這樣做了,我也不認爲我可以修改相關的代碼。
在linux上專門使用g ++,有沒有一種方法可以確定爲特定語句選擇了哪個重載或模板函數?可以編譯器告訴我它選擇了哪個重載或模板函數?
具體而言,我不認爲我不一定知道所有的可能的選擇,這可能是在頭文件中的各種庫的到來。即使我這樣做了,我也不認爲我可以修改相關的代碼。
我不知道直接做這件事的方法。
最簡單的辦法是設置在調用點和單步成任何函數被調用斷點;那麼你的調試器可以告訴你哪個函數你是。
一個IDE像Eclipse CDT能做超載和模板決議本身(如果一切正常,右),那麼右鍵點擊一個函數調用,並打算在函數聲明會帶你去適當的功能。
通過故意創建一個模糊的函數調用,如this answer中所述,您可以獲取所有可用重載和模板的列表,並且可能會找出哪一個被調用。
如馬修M.說,鏘可以dump its AST。這需要一些解釋,但它可以幫助你找出哪個函數被調用。
謝謝。如果Eclipse真的能做到這一點,我印象深刻,這將是一個不錯的解決方案。 –
@ c-urchin - 讓Eclipse正確識別各種源文件和頭文件可能會非常棘手,特別複雜的C++代碼很難將其混淆,但一旦它運行起來就非常好。 –
@ c-urchin - MS VS也可以做到這一點。將鼠標光標移至功能名稱,您可以看到呼叫超載功能的名稱和超載功能的數量。我認爲任何現代IDE都必須這樣做。 – SergV
部分答案。
可以使用非標準的宏在運行時(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]
謝謝,但正如我所說,我不能假定我可以修改源代碼,或者我甚至知道哪些代碼可能是候選人,因爲它可能來自任何#include文件(在任何級別) –
http://stackoverflow.com/questions/1496497/how-can-i-see-parse-tree-intermediate-code-optimization-code-and-assembly-code可能是有用的 - 即,看看中間編譯器的步驟。如果你只想做一次這樣的事情,你可以看看生成的目標文件,也可以圍繞你想要了解的呼叫貼上一個「標記」函數調用。目標文件將指出它調用的函數的符號名稱,它可以被重新引用到您調用的函數簽名中(它應該是唯一的)。 – Yakk
我經常說我們需要的是一個編譯時調試器,以便您可以在模板實例化過程中逐步進行評估,查看模板參數等,以查看實際情況。 –
當你說*看*時,你的意思是什麼? Clang因爲爲C++生成完全形成的AST而臭名昭着,但是您需要圍繞其庫編寫一個程序才能「看到」。 –