__thiscall
Блок, относящийся только к системам Microsoft
Соглашение о вызовах __thiscall используется для функций-членов. Оно по умолчанию используется функциями членами C++, в которых не используются переменные-аргументы. В соглашении о вызовах __thiscall вызываемый метод очищает стек, что невозможно для функций vararg. В архитектуре x86 аргументы отправляются в стек справа налево, причем указатель this передается через регистр ECX, а не помещается в стек.
Соглашение о вызовах __thiscall, в частности, может использоваться в классах, чьи функции-члены по умолчанию используют __clrcall. В этом случае __thiscall может использоваться для того, чтобы отдельные функции-члены можно было вызывать из машинного кода.
При компиляции с параметром /clr:pure все функции и указатели на функции используют соглашение о вызовах __clrcall, если не указано иное.
В версиях до Visual C++ 2005 соглашение о вызовах thiscall не могло быть явным образом указано в программе, поскольку thiscall не являлось ключевым словом.
Функции-члены vararg используют соглашение о вызовах __cdecl. Все аргументы функции передаются в стеке, причем указатель this помещается в стек последним.
Поскольку это соглашение о вызовах применяется только к C++, схема оформления имени C отсутствует.
На машинах с архитектурой ARM и x64 ключевое слово __thiscall принимается и игнорируется компилятором.
Если используется внестрочное определение нестатической функции класса, то модификатор соглашения о вызовах не должен быть задан во внестрочном определении. То есть для нестатических методов-членов считается, что соглашение о вызовах, указанное во время объявления, было сделано в точке определения.
Пример
// thiscall_cc.cpp
// compile with: /c /clr:oldSyntax
struct CMyClass {
void __thiscall mymethod();
void __clrcall mymethod2();
};