C++ 如何知道重载gcc选择哪个函数
这是我的背景:C++ 如何知道重载gcc选择哪个函数,c++,gcc,overloading,C++,Gcc,Overloading,这是我的背景: #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"
#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;
}
并且编译时没有错误,没有警告。在这个简单的例子中,我知道当GCC对to_string(y)
进行名称查找时,它会查找to_string(priority)
,但在一个大项目中,查找GCC选择了哪个函数并不简单
那么,有没有一种方法可以通过检查.o或将选项传递给GCC来确定GCC选择了哪个函数“后验概率”
我在linux上使用GCC4.7.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)
:
标准::字符串到_字符串(XXX x)
及
:
std::字符串到_字符串(优先级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
std::cout通过调试器逐步完成吗?一些IDE还可以定位实际使用的重载并为代码导航提供该信息。您可以通过将优先级设置为非整数类型来避免这种情况,例如enum
例如std::string na::to_string(XXX x x)
在main的范围内是未知的,所以这是显而易见的。@scones-这很好,因为@sanderedycker今天学到了一些新东西,谢谢你,确实,这很清楚!我在demangle的objdump中添加了-C。谢谢!
<_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