c++之函数原型
函数原型:
[作用域] [函数连接规范] 返回值类型 [函数调用规范] 函数名 (类型1[形参1]...);
函数定义:
[函数连接规范] 返回值类型 [函数调用规范] 函数名 (形参列表)
{......}
接口函数一定要指定调用规范,若不指定(使用默认),当别人声明该接口时与默认的调用规范不一致(函数原型与实现的调度规范不一致)时,将发生编译连接错误,或运行时崩溃。
函数调用规范:
_cdecl : c/c++默认规范,从右向左压参,能用于可变参数,调用函数负责堆栈清理。
_stdcall : Win API调用规范,从右向左压参,被调函数负责堆栈清理,若函数为变参时,会自动转换为_cdecl。
_thiscall : c++非静态成员函数调用默认规范,不可变参,调用时,this指针保存到ECX寄存器。其它与_stdcall一致。
_fastcall : 实参全放到寄存器中,所以很快,不能用于成员函数,被调函数负责清理堆栈。
函数连接规范:
主要影响名字的改编方案。
多语言开发时,要统一函数、变量、数据类型、常量等的连接规范。
常用的规范是 extern "c" . c++中调用c编译函数时,通常要使用此连接。应为c++比c多了重载函数的能力,为了区别重载函数,在c++编译器改编重载函数名称时与c的不一样。如:void func(int a, int b);对于c编译器改编后的名字可能是_func, 而c++编译器改编后可能是_func_int_int。