自变量传递和命名约定

Microsoft 专用

利用 Microsoft C++ 编译器,你可以指定在函数和调用方之间传递参数和返回值的约定。 并非所有约定都在所有支持的平台上可用,某些约定使用平台特定的实现。 在大多数情况下,将忽略在特定平台上指定不支持的约定的关键字或编译器开关,并将使用平台默认约定。

在 x86 平台上,所有参数在传递时都将加宽到 32 位。 返回值也将加宽到 32 位,并将通过 EAX 寄存器返回,但在 EDX:EAX 寄存器对中返回的 8 字节结构除外。 更大的结构将在 EAX 寄存器中作为指向隐藏返回结构的指针返回。 参数将从右到左推送到堆栈中。 不是 POD 的结构不会在寄存器中返回。

编译器将生成 prolog 和 epilog 代码来保存并还原 ESI、EDI、EBX 和 EBP 寄存器(如果在函数中使用了它们)。

注意

当结构、联合或类由值从函数返回时,类型的所有定义需要相同,否则程序可能在运行时失败。

有关如何定义自己的函数 prolog 和 epilog 代码的信息,请参阅裸函数调用

有关面向 x64 平台的代码中的默认调用约定的信息,请参阅 x64 调用约定。 有关面向 ARM 平台的代码中的调用约定问题的信息,请参阅常见的 Visual C++ ARM 迁移问题

Visual C/C++ 编译器支持下列调用约定。

关键字 堆栈清理 参数传递
__cdecl 调用方 在堆栈上按相反顺序推送参数(从右到左)
__clrcall 不适用 按顺序将参数加载到 CLR 表达式堆栈上(从左到右)。
__stdcall 被调用方 在堆栈上按相反顺序推送参数(从右到左)
__fastcall 被调用方 存储在寄存器中,然后在堆栈上推送
__thiscall 被调用方 在堆栈上推送;存储在 ECX 中的 this 指针
__vectorcall 被调用方 存储在寄存器中,然后按相反顺序在堆栈上推送(从右到左)

若要了解相关信息,请参阅已过时的调用约定

结束 Microsoft 专用

另请参阅

调用约定