Microsoft 固有の仕様Microsoft Specific

_ _Thiscall呼び出し規約はメンバー関数で使用し、呼び出し規約を使用して既定値は、C++メンバー関数を可変個の引数を使用しないでください。The __thiscall calling convention is used on member functions and is the default calling convention used by C++ member functions that do not use variable arguments. _ _Thiscall、呼び出し先のことはできませんが、スタックを消去するvararg関数。Under __thiscall, the callee cleans the stack, which is impossible for vararg functions. 右から左への引数をスタックにプッシュは、このポインター レジスタ ECX、および、x86 上で、スタックに渡されるアーキテクチャ。Arguments are pushed on the stack from right to left, with the this pointer being passed via register ECX, and not on the stack, on the x86 architecture.

使用する理由の 1 つ _ _thiscallクラス メンバー関数が使用されて__clrcall既定。One reason to use __thiscall is in classes whose member functions use __clrcall by default. 使用する場合、 _ _thiscall個々 のメンバーの関数をネイティブ コードから呼び出すことにします。In that case, you can use __thiscall to make individual member functions callable from native code.

コンパイルするときに/clr: 純粋な、すべての関数および関数ポインターは__clrcallそれ以外の場合に指定されていない場合。When compiling with /clr:pure, all functions and function pointers are __clrcall unless specified otherwise. /Clr: 純粋な/clr:safeコンパイラ オプションは Visual Studio 2015 で非推奨とされ、Visual Studio 2017 でサポートされていません。The /clr:pure and /clr:safe compiler options are deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.

Visual Studio 2005 では、以前のリリースで、 _ _thiscall呼び出し規約がいない明示的に指定するプログラムでは、ため _ _thiscallがキーワードではありません。In releases before Visual Studio 2005, the __thiscall calling convention could not be explicitly specified in a program, because __thiscall was not a keyword.

vararg メンバー関数の使用、 _ _cdecl呼び出し規約。vararg member functions use the __cdecl calling convention. すべての関数の引数はで、スタックにプッシュされます、このポインターはスタックに最後に配置All function arguments are pushed on the stack, with the this pointer placed on the stack last

この呼び出し規則は C++ だけに適用されるため、C の名前の装飾スキームはありません。Because this calling convention applies only to C++, there is no C name decoration scheme.

ARM と x64 マシン _ _thiscallが受け入れられるし、コンパイラによって無視されます。On ARM and x64 machines, __thiscall is accepted and ignored by the compiler.

静的でないクラス関数がアウトオブラインで宣言されている場合、アウトオブラインの宣言で呼び出し規則の修飾子を指定する必要はありません。For non-static class functions, if the function is defined out-of-line, the calling convention modifier does not have to be specified on the out-of-line definition. つまり、クラスの静的でないメンバー メソッドの場合は、宣言時に指定された呼び出し規則が定義の時点で仮定されます。That is, for class non-static member methods, the calling convention specified during declaration is assumed at the point of definition.

Microsoft 固有の仕様はここまでEND Microsoft Specific

関連項目See also

引数の渡し規則と名前付け規則Argument Passing and Naming Conventions