c++++ 具有三个调用约定:__cdecl__(调用者清理参数)、__stdcall__(调用者和被调用者清理参数)和__fastcall__(参数通过寄存器传递)。__cdecl__ 主要用于 windows 和 linux;__stdcall__ 主要用于 windows api 函数;__fastcall__ 主要用于 32 位 windows 程序。

C++ 函数调用约定:不同的世界
引言
在 C++ 中,函数调用约定定义了参数传递给函数以及函数结果返回的方式。不同的调用约定存在于不同的平台和编译器中。了解这些差异对于编写跨平台兼容的代码至关重要。
立即学习“C++免费学习笔记(深入)”;
调用约定类型
YXPHP6系统可以看做是一个模版平台,而且它又能独立工作. 而且YXPHP6系统也不需要数据库支持. 你可以开发自己的模板,也可以同步官方的模板后进行自己的二次开发,前提是您对YXPHP6要有一定的了解.YXPHP6不仅可以用作企业建站,甚至是blog,只要是您能想到的,YXPHP6几乎都可以胜任. 因为YXPHP6系统本身与模板之间可以说是独立运行的.也就是说,不管你做什么样的网站或者是应用,
C++ 中有三种常见的调用约定:
- __cdecl__(默认):在这种约定下,调用者负责清理堆栈上的参数。主要用于 Windows 和 Linux。
- __stdcall__:调用者和被调用者都负责清理堆栈上的参数。主要用于 Windows API 函数。
- __fastcall__:参数由 CPU 寄存器传递,仅适用于前几个参数(通常为前两个)。主要用于 32 位 Windows 程序。
参数传递
- __cdecl__:参数从右到左入栈,结果在 rax 中返回。
- __stdcall__:前两个参数通过寄存器(rcx 和 rdx)传递,其余参数入栈。结果在 eax 中返回。
- __fastcall__:前两个参数通过寄存器(rcx 和 rdx)传递,后续参数入栈。结果在 eax 中返回。
结果返回
- __cdecl__:32 位结果保存在 eax 中,64 位结果保存在 rax 中。
- __stdcall__:32 位结果保存在 eax 中,64 位结果保存在 rax 中。
- __fastcall__:32 位结果保存在 eax 中,64 位结果保存在 rax 中。
实战案例
下面是一个使用不同调用约定的函数调用的示例代码:
// cdecl 函数
int cdecl_func(int a, int b) {
return a + b;
}
// stdcall 函数
int stdcall_func(int a, int b) {
return a + b;
}
// fastcall 函数
int fastcall_func(int a, int b) {
return a + b;
}
int main() {
// 调用 cdecl 函数
int cdecl_result = cdecl_func(1, 2);
// 调用 stdcall 函数
int stdcall_result = stdcall_func(1, 2);
// 调用 fastcall 函数
int fastcall_result = fastcall_func(1, 2);
return 0;
}







