在C++中,函数名在编译后发生变化,并且在函数名前后增加特殊字符(如Z15
),这是由于C++的名称修饰(Name Mangling)机制导致的。
名称修饰的原因
C++支持函数重载,即允许有相同名称但参数列表不同的函数共存。为了在链接时区分这些重载函数,编译器会对函数名进行修饰,添加一些特殊的字符和编码,这些编码包含了函数的参数类型、返回类型等信息。
例如,一个简单的函数void foo()
在经过名称修饰后可能变成_Z3foov
。其中:
_Z
是C++名称修饰的前缀。3
表示函数名的字符数。foo
是函数名。v
表示该函数没有参数。
如何避免名称修饰
如果你希望在动态库中直接通过原始函数名调用函数,可以使用extern "C"
来禁用C++的名称修饰。例如:
extern "C" {
void foo();
}
在这种情况下,使用nm
命令查看动态库时,函数名将保持不变。
使用nm
命令查看符号
nm
命令用于查看目标文件或动态库中的符号表。如果你在编译时没有使用extern "C"
,那么函数名会被修饰,你将看到类似_Z15your_function_name
的符号。如果使用了extern "C"
,则符号表中显示的函数名将与源代码中的函数名一致。
总结
- 函数名前后增加
Z15
等字符是C++名称修饰的结果。 - 使用
extern "C"
可以避免名称修饰,方便在动态库中直接通过原始函数名调用。 - 使用
nm
命令可以查看动态库中的符号,帮助确认函数名的变化。