__thiscall

特定于 Microsoft__thiscall 的调用约定用于 x86 体系结构上的 C++ 类成员函数。 它是成员函数使用的默认调用约定,该约定不使用变量参数(vararg 函数)。

__thiscall 下,被调用方清理堆栈,这对于 vararg 函数是不可能的。 自变量将从右到左推送到堆栈中。 指针 this 通过注册 ECX 传递,而不是在堆栈上传递。

在 ARM、ARM64 和 x64 计算机上,__thiscall 由编译器接受和忽略。 这是因为它们默认使用基于寄存器的调用约定。

使用 __thiscall 的原因之一是在类中成员函数默认使用 __clrcall。 在这种情况下,可以使用 __thiscall 确保各个成员函数可以从本机代码调用。

采用 /clr:pure 进行编译时,除非另有规定,否则所有函数和函数指针都是 __clrcall/clr:pure/clr:safe 编译器选项在 Visual Studio 2015 中已弃用,并且在 Visual Studio 2017 中不受支持。

vararg 成员函数使用 __cdecl 调用约定。 所有函数参数都推送在堆栈上,this 指针放在最后一个堆栈上。

由于此调用约定仅适用于 C++,因此它没有 C 名称修饰方案。

在非静态类成员函数外行定义时,仅在声明中指定调用约定修饰符。 无需在行外定义上再次指定它。 编译器使用在定义点声明期间指定的调用约定。

另请参阅

参数传递和命名约定