__thiscall

A convenção de chamada específica da Microsoft__thiscall é usada em funções de membro da classe C++ na arquitetura x86. É a convenção de chamada padrão usada por funções de membro que não usam argumentos variáveis (funções vararg).

Sob __thiscall, o receptor limpa a pilha, o que é impossível para funções vararg. Os argumentos são enviados por push para a pilha da direita para a esquerda. O ponteiro this é passado por meio do registro ECX, não na pilha.

Em computadores ARM, ARM64 e x64, __thiscall é aceito e ignorado pelo compilador. Isso ocorre porque eles usam uma convenção de chamada baseada em registro por padrão.

Uma razão para usar __thiscall está em classes cujas funções de membro usam __clrcall por padrão. Nesse caso, você pode usar __thiscall para tornar funções de membro individuais com base em código nativo.

Ao compilar com /clr:pure, todas as funções e ponteiros de função são __clrcall, exceto se especificada de outra forma. As opções do compilador /clr:pure e /clr:safe foram preteridas no Visual Studio 2015 e são incompatíveis com o Visual Studio 2017.

As funções de membro vararg usam a convenção de chamada __cdecl. Todos os argumentos de função são enviadas por push na pilha, com o ponteiro this posicionado na última pilha.

Como essa convenção de chamada se aplica apenas a C++, não há nenhum esquema de decoração de nome C.

Quando você define uma função de membro de classe não estática fora de linha, especifique o modificador de convenção de chamada apenas na declaração. Você não precisa especificá-lo novamente na definição fora de linha. O compilador usa a convenção de chamada especificada durante a declaração no ponto de definição.

Confira também

Passagem de argumento e convenções de nomenclatura