Name Mangling是C++编译器为支持函数重载等特性而将含参数类型、类、命名空间等信息的函数名编码为唯一符号的机制;它非标准强制,各编译器实现不兼容;extern "C"可禁用该机制以实现C语言链接兼容。

Name Mangling(名称修饰)是C++编译器为解决函数重载、命名空间、类作用域等特性而设计的一套规则:把源码中语义丰富的函数名(含参数类型、所在类、命名空间等)编码成一个全局唯一的、符合目标平台链接器要求的底层符号名(symbol name)。它不是语言标准强制规定的,而是各编译器(如GCC、Clang、MSVC)各自实现的约定,因此不同编译器生成的符号通常不兼容。
为什么C++需要Name Mangling?
C语言只靠函数名作符号,同一作用域下不允许同名函数——这和C++的函数重载直接冲突。比如:
void foo(int); void foo(double); void foo(int, int);
登录后复制
它们在源码中都叫foo,但语义完全不同。链接器只认符号名,不理解C++语法。Name Mangling 把它们分别变成类似 _Z3fooi、_Z3food、_Z3fooiS_ 这样的唯一符号(以GCC为例),让链接器能区分调用的是哪个版本。
重载函数如何靠Name Mangling实现?
编译器在编译阶段就根据函数声明完整信息生成修饰名,关键要素包括:
立即学习“C++免费学习笔记(深入)”;
- 函数名本身(如
foo) - 参数类型的完整类型编码(
int→i,double→d,std::string→Ss等) - 是否为成员函数(加类名前缀,如
N3Bar3BazE3fooi表示Bar::Baz::foo(int)) - const/volatile限定、引用/右值引用等也会参与编码
调用点(call site)处,编译器同样按相同规则生成被调函数的修饰名;链接时,链接器只匹配这些修饰后的符号——这就实现了“同名不同参 → 不同符号 → 正确绑定”的重载机制。
还木有评论哦,快来抢沙发吧~