C++ 函数调用时的参数传递方法
C++语言的函数调用
在编译后的ELF文件中,不论是C++函数还是C函数,甚至是汇编语言函数,它们之间没有任何区别。但是,C++函数在编译时会经过函数名变换(mangle)。例如,对于如下C++函数func:
class foo {
public:
void func(int x, int y);
};
函数foo::func在ELF文件中被变换成下面的符号(mangle之后的符号名依赖于具体的实现):
# nm foo | grep foo
0000000000400508 T _ZN3foo4funcEii
另外,要从被mangle后的符号(mangled synbol)中恢复源代码中的函数原型(即进行demangle),可以使用c++filt命令(或者 nm的-C选项):
# nm foo | grep foo | c++filt
0000000000400508 T foo::func(int, int)
或者:
# nm -C foo | grep foo
0000000000400508 T foo::func(int, int)
C++函数foo::func被调用时,传递的参数比原型声明的参数多一个this指针:
void func(class foo *this, int x, int y);
在x86_64中查看参数
要查看参数的值,先用-g选项编译程序,然后用GD