命名修饰
Name mangling is the encoding of function and variable names into unique names so that linkers can separate common names in the language.
Name mangling 实际上是对函数(或者变量)名称的一种编码,c++支持函数重载,而 c 不支持。所以 c++的函数签名的编码方式肯定是和 c 不一样的,举个例子:
int foo(int a); // foo
int foo(int a); // foo(int)
int foo(float a); // foo(float)
也可以理解为,函数原型经过编码之后得到的唯一 id,暴露给 linker 用的。linker 根据这个名字去查找、链接相应的函数地址。
同样一段 c 代码,用 c compiler 和 c++ compiler 编出来的函数&变量名称是不一样的。c++的通常会复杂一些,包含 namespace,class,形参类型列表等。当使用 c++ compiler 且不想要上述 mangling 的时候,可以使用:
extern "C" {
int foo(int a);
void bar(int b);
}
来告诉编译器这些名字不要进行 name mangle. 这在 c 调用 c++方法时尤其有用。
See also 链接