调用惯例一般包括以下三方面的内容: · 函数参数的传递顺序和方式 · 栈的维护方式 · 名字修饰(Name-mangling)的策略 在C语言里,存在着多个调用惯例,而默认的调用惯例是:cdecl。任何一个没有显示指定调用惯例的函数都默认是cdecl惯例。对于函数:int foo(int n, float m)而言,它的完整形式是: int _cdecl foo(int n, float m) (MSVC编译器) 此外,还存在很多别的调用惯例:cdecl,stdcall,fastcall,pascal四种调用惯例,之间的具体区别如下表:
此外,不少编译器还提供一种称为naked call的调用惯例, 这种调用惯例在特殊的场合,其特点是编译器不产生任何保护寄存器的代码,故称故称为naked call。 对于C++语言,以上几种调用惯例的名字修饰策略都有所改变(C++有自己更加复杂的名字修饰策略)。 |
|