所谓C/C++函数调用规范,是指进行一次函数调用所采用的传递参数的方法,返回值的处理以及调用堆栈的清理。
VC++集成调试环境中提供了如下三种调用规范,它们的参数入栈方式都是自右向左的,32位整型的返回值的处理也都是将返回值放到寄存器eax中,如果返回值是64位整型的,就用edx:eax。浮点返回值则放在浮点寄存器ST(0)中。这三种调用规范的区别主要在是函数堆栈的处理上。
- _cdecl:由调用者进行堆栈清理。优点是可以实现变参函数。缺点是每一次函数调用,调用者都要额外执行一条进行堆栈清理的代码,程序文件偏大一些。
- _stdcall:被调用者自己清理函数所用堆栈。优点是调用者无须清理堆栈了,程序文件会小一些。缺点是无法实现变参函数。(所谓变参函数,即类似与printf之类的函数)。
- _fastcall:它与_stdcall的仅有的区别是函数的前两个参数由寄存器ecx,edx传递,CPU寄存器的读写速度是最快的,所以其效率比上面两种高!windows的内核广泛采用了这种调用规范。
注意:调用者与被调用者所采用的调用规范必须得一致,否则有可能会出现莫名其妙的错误。也就是说,如果你的被调用的函数是_stdcall格式的,那么调用者也必须是_stdcall格式。为了让代码更标准,在其他类型的C++编译器也能够运行,还是将微软的APIENTRY改成_stdcall吧。
Visual C++.net 2003中可以对整个项目或者项目中的某些文件设置C/C++默认调用规范,VC++编译器的默认设置是_cdecl的。如果你要修改该默认值,可以在项目属性中进行设置(自个在项目属性对话框中找去吧,现在用Linux,没有VC了,无法抓图)。