2015-03-19 81 views
2

這是我的背景:如何知道哪些函數重載GCC選擇

#include <string> 
#include <map> 
#include <sstream> 
#include <iostream> 

namespace na { 
    enum XXX { X1, X2 }; 

    std::string to_string(XXX x) { 
     static const std::map<XXX, std::string> MAP { {X1, "X1"}, {X2, "X2"} }; 

     return MAP.at(x); 
    } 
} 

namespace nb { 
    enum YYY { Y1 = 1001, Y2 = 1002 }; 
} 

typedef char priority; 

std::string to_string(priority p) { 
    std::ostringstream oss; 
    oss << p; 
    return oss.str(); 
} 

int main() 
{ 
    na::XXX x = na::X1; 

    std::cout << "x: " << to_string(x) << "\n"; 

    nb::YYY y = nb::Y2; 

    std::cout << "y: " << to_string(y) << "\n"; 

    return 0; 
} 

的呼叫to_string(y)是一個「錯誤」,因爲沒有功能to_string存在類型nb::YYY。但實際上這是有效的!

我編譯這個用:

g++ -o main.o -c -std=c++11 -Wall -Wextra -pedantic main.cpp 
g++ -o function_overloading main.o 

這編譯,沒有錯誤,沒有任何警告。在這種簡單的情況我知道,當GCC這個名字查找了to_string(y)發現to_string(priority)但在一個大項目,它不是簡單的找哪個功能GCC選擇了。

那麼,有沒有一種方法來確定哪些功能GCC選擇,「後天」,通過檢查的.o,或通過傳遞一個選項,GCC?

我在Linux上使用GCC 4.7.2。

+3

用調試器來逐步完成它?一些IDE還可以設法找到實際使用的過載併爲代碼導航提供該信息。 – 2015-03-19 09:42:47

+0

你可以通過將'priority'設置爲非整數類型來避免這種情況,例如'enum'。 – 2015-03-19 09:57:19

+0

'std :: string na :: to_string(XXX x)'在main的範圍內是未知的,所以這將是顯而易見的。 – scones 2015-03-19 10:25:57

回答

2

您可能使用源信息objdump。讓我們試試你的例子(我會用gcc 4.9.2爲了清晰:

g++ -c -O0 -gdwarf-2 gccover.cpp -std=c++11 
objdump -Sdr gccover.o >& gccover.dis 

您將看到:

<_ZN2na9to_stringENS_3XXXE>: 
std::string to_string(XXX x) 

<_Z9to_stringc>: 
std::string to_string(priority p) 

現在只是去調用點,並期待實際上稱爲什麼

 std::cout << "y: " << to_string(y) << "\n"; 
296: 8b 45 e8    mov -0x18(%rbp),%eax 
299: 0f be d0    movsbl %al,%edx 
29c: 48 8d 45 e0   lea -0x20(%rbp),%rax 
2a0: 89 d6     mov %edx,%esi 
2a2: 48 89 c7    mov %rax,%rdi 
2a5: e8 00 00 00 00  callq 2aa <main+0x76> 
     2a6: R_X86_64_PC32 _Z9to_stringc-0x4 

我想,一切都很清楚。

+0

事實上,這是明確的!我添加了-C到objdump去demangle。謝謝 ! – merovingien 2015-03-19 14:49:32

相關問題