__thiscall
Microsoft 固有の__thiscall
呼び出し規則は、x86 アーキテクチャ上の C++ クラス メンバー関数で使用されます。 これは、可変引数 (vararg
関数) を使わないメンバー関数によって使用される既定の呼び出し規則です。
__thiscall
では呼び出し先がスタックをクリーンアップしますが、これは vararg
関数では不可能です。 引数は、スタックに右から左へプッシュされます。 this
ポインターは、スタックではなく、レジスタ ECX を介して渡されます。
ARM、ARM64、x64 コンピューターでは、__thiscall
がコンパイラによって受け入れられたり、無視されたりします。 これは、既定でレジスタベースの呼び出し規則が使用されるためです。
__thiscall
を使用する理由の 1 つは、メンバー関数が既定で __clrcall
を使用するクラスにあります。 その場合、__thiscall
を使用して、個々のメンバー関数をネイティブ コードから呼び出せるようにすることができます。
/clr:pure
を指定してコンパイルすると、すべての関数および関数ポインターは、特に指定がない場合は __clrcall
になります。 /clr:pure
および /clr:safe
コンパイラ オプションは Visual Studio 2015 では非推奨とされており、Visual Studio 2017 ではサポートされていません。
vararg
メンバー関数では __cdecl
の呼び出し規則が使用されます。 関数のすべての引数は、スタックにプッシュされ、this
ポインターが最後にスタックに配置されます。
この呼び出し規則は C++ だけに適用されるため、C の名前の装飾スキームはありません。
非静的クラス メンバー関数をアウトオブラインで定義する場合は、宣言内でのみ呼び出し規則修飾子を指定します。 アウトオブライン定義でもう一度指定する必要はありません。 コンパイラは、定義の時点で宣言時に指定された呼び出し規則を使用します。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示