
名字修饰(Name Mangling)是C++编译器为解决函数重载、类作用域、模板实例化等语言特性带来的符号唯一性问题,而对源码中标识符进行编码生成唯一内部符号名的过程。它不是标准强制要求,但所有主流编译器(如GCC、Clang、MSVC)都实现自己的修饰规则,目的是让链接器能准确区分语义不同但源码名相同的函数或变量。
为什么C++需要名字修饰?
C语言只支持全局作用域和静态作用域,函数名直接映射为符号表中的字符串(如printf),链接器靠名字就能匹配。但C++有:
- 同名函数重载(void foo(int) 和 void foo(double))
- 类成员函数(A::bar() 和 B::bar())
- 命名空间嵌套(ns1::ns2::func())
- 模板实例(std::vector
和 std::vector )
这些在源码中可能共用同一标识符,但语义完全不同。若不修饰,目标文件的符号表里就会出现大量重复名字,链接器无法分辨——名字修饰就是把“语义信息”编码进符号名中。
名字修饰长什么样?以GCC为例
假设写了一个简单函数:
立即学习“C++免费学习笔记(深入)”;
namespace ns {
class A {
public:
void func(int x);
};
}登录后复制
GCC(Itanium ABI)会把它修饰成类似:
_ZN2ns1A4funcEi
标签: c++ 名字修饰 c语言 编码 工具 作用域 为什么
还木有评论哦,快来抢沙发吧~