1 前言
在C和C++编程中,函数调用约定(Calling Convention)定义了函数参数如何传递、由谁负责清理栈(如果有的话)、以及返回值如何传递等规则。不同的平台和编译器可能采用不同的调用约定。以下是一些常见的调用约定及其特点的详细说明:
2 __cdecl
- 定义与特点:
__cdecl是C语言默认的调用约定,在C++中也可使用,但不是类成员函数的默认调用约定。
参数从右向左压入堆栈。
调用者负责清理堆栈,这意味着调用者需要知道传递了多少参数,并据此调整堆栈指针。
支持可变参数列表的函数(如printf)必须使用此调用约定。
函数名在编译后通常不会改变(尽管在某些编译器中可能会添加前缀,如下划线)。 - 适用场景:
C语言编写的程序。
在Windows上用于一些API函数(尽管Windows API主要使用__stdcall)。
需要实现可变参数列表的函数。
3 __stdcall
- 定义与特点:
__stdcall是Windows API中广泛使用的调用约定。
参数也是从右向左压入堆栈,但与被调用者(callee)负责清理堆栈的__cdecl不同,__stdcall由被调用者清理堆栈。
函数名在编译时会加上一个特定的后缀(如“_”前缀和参数