示例代码
main.cpp
cpp
#include <iostream>
namespace test12 {
void func(){std::cout << "test123::func()" << std::endl;}
void func(int x){std::cout << "test123::func(int x)" << std::endl;}
void func(char x){std::cout << "test123::func(char x)" << std::endl;}
void func(double x){std::cout << "test123::func(double x)" << std::endl;}
void func(std::string s){std::cout << "test123::func(std::string s)" << std::endl;}
void func(int x, char y){std::cout << "test123::func(int x, char y)" << std::endl;}
void func(char x, int y){std::cout << "test123::func(char x, int y)" << std::endl;}
}
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
查看符号表
使用g++编译:
bash
g++ -c main.cpp
查看符号表:
bash
nm main.o

总结
编译器将程序中的变量和函数编译为一个个的符号,存到符号表。
重载函数在编译为符号时,是根据函数名、形参类型进行转化的。
例如:
bash
void func(int x){std::cout << "test123::func(int x)" << std::endl;}
000000000000003a T _ZN6test124funcEi
其中test12是namespace,func是函数名,i表示int类型的形参。
c代码不支持重载,是因为符号是由函数名确定的,没有像c++一样使用形参。gcc编译c代码时遇到函数重载无法编译,而g++可以对其编译。