__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 名称修饰方案。
在非静态类成员函数外行定义时,仅在声明中指定调用约定修饰符。 无需在行外定义上再次指定它。 编译器使用在定义点声明期间指定的调用约定。