2010-01-04 74 views
4

我有一個簡單函數模板:查看函數模板實例

#include <iostream> 
using namespace std; 

template <class T> 
T GetMax (T a, T b) { 
    T result; 
    result = (a > b) ? a : b; 
    return (result); 
} 

int main() { 
    cout << GetMax<int>(5, 6) << endl; 
    cout << GetMax<long>(10, 5) << endl; 
    return 0; 
} 

上面的例子將產生2個函數模板實例,一個用於INT,另一個用於。是否有任何g ++選項來查看函數模板實例化?

+0

我平時儘量不要從編輯預期的內容,但如果你給老鼠一塊餅乾。雖然,諷刺的是,我離開了語法,我無法忍受,這是「CPP」標籤(意思是「C預處理器「,而不是」C++「),提示編輯;但最大的變化是使用「實例化」,這是標準用於「生成」這些術語的術語。 – 2010-01-04 02:37:12

+0

感謝羅傑的評論。我會按照你的提示。 – 2010-01-04 04:10:13

回答

5

您可以使用nm程序(binutils的一部分)來查看程序使用的符號列表。例如:

$ g++ test.cc -o test 
$ nm test | grep GetMax 
00002ef0 T __Z6GetMaxIiET_S0_S0_ 
00002f5c T __Z6GetMaxIiET_S0_S0_.eh 
00002f17 T __Z6GetMaxIlET_S0_S0_ 
00002f80 T __Z6GetMaxIlET_S0_S0_.eh 

我不知道爲什麼每個人都有兩個副本,一個具有.eh後綴,但除此之外,你可以說這個特定的功能被實例化兩次。如果你的nm版本支持-C/--demangle標誌,你可以用它來獲取可讀的名稱:

$ nm --demangle test | grep GetMax 
00002ef0 T int GetMax<int>(int, int) 
00002f5c T _Z6GetMaxIiET_S0_S0_.eh 
00002f17 T long GetMax<long>(long, long) 
00002f80 T _Z6GetMaxIlET_S0_S0_.eh 

如果不支持該選項,您可以使用c++filt來還原函數他們:

$ nm test | grep GetMax | c++filt 
00002ef0 T int GetMax<int>(int, int) 
00002f5c T __Z6GetMaxIiET_S0_S0_.eh 
00002f17 T long GetMax<long>(long, long) 
00002f80 T __Z6GetMaxIlET_S0_S0_.eh 

所以,你可以看到GetMax分別用intlong實例化。

1

如果您有鏈接生成的地圖文件,你可以看到所有生成的符號的名稱。一些用grep/perl解析可能會得到你想要的。名字將被打亂。

此命令行工作對我來說:

g++ -o test -Wl,-map,test.map test.cpp 

test.map將會產生。

這可能進一步下來管道不是你要找的,但。

+1

另一個選擇是nm程序,它是binutils的一部分,因此應該在任何可用GCC的平臺上使用。 – 2010-01-04 02:13:13