引数の渡し規則と名前付け規則
Microsoft 固有の仕様
Microsoft C++ コンパイラでは、関数と呼び出し元の間の、引数と戻り値の受け渡しに関する規約を指定することができます。 サポートされるすべてのプラットフォームですべての規約がサポートされるわけではありません。また、一部の規約は、プラットフォーム固有の実装を使用します。 ほとんどの場合、特定のプラットフォームでサポートされていない規約を指定するキーワードやコンパイラ スイッチは無視され、プラットフォームの既定の規約が使用されます。
x86 プラットフォームでは、すべての引数は渡されたときに 32 ビットに拡大変換されます。 EDX:EAX レジスタ ペアに返される 8 バイトの構造体を除き、戻り値も 32 ビットに拡張され、EAX レジスタに返されます。 より大きな構造体は、非表示の戻り値の構造体へのポインターとして EAX レジスタに返されます。 パラメーターは、スタックに右から左へプッシュされます。 POD ではない構造体はレジスタ内では返されません。
コンパイラは、関数で ESI、EDI、EBX、および EBP レジスタが使用されている場合、それらを保存および復元するためにプロローグ コードとエピローグ コードを生成します。
Note
構造体、共用体、またはクラスが値渡しで関数から戻される場合は、型のすべての定義が同じである必要があります。そうでないと、実行時にプログラムが失敗することがあります。
独自の関数プロローグおよびエピローグ コードを定義する方法については、「naked 関数の呼び出し」を参照してください。
x64 プラットフォームを対象としたコードでの既定の呼び出し規約については、「x64 呼び出し規則」を参照してください。 ARM プラットフォームを対象としたコードでの呼び出し規約の問題については、「Visual C++ の ARM への移行に関する一般的な問題」を参照してください。
次の呼び出し規約は Visual C/C++ コンパイラでサポートされます。
Keyword | スタック クリーンアップ | パラメーター渡し |
---|---|---|
__cdecl | 呼び出し側 | パラメーターをスタックに逆の順序で (右から左に) プッシュする |
__clrcall | 該当なし | CLR 式スタックに順に (左から右に) パラメーターを読み込む |
__stdcall | Callee | パラメーターをスタックに逆の順序で (右から左に) プッシュする |
__fastcall | Callee | レジスタに格納されてから、スタックにプッシュされる |
__thiscall | Callee | スタックにプッシュされる (ECX 内に格納されている this ポインター) |
__vectorcall | Callee | レジスタに格納されてから、スタックに逆の順序で (右から左に) プッシュされる |
関連情報については、「廃止された呼び出し規則」を参照してください。
Microsoft 固有の仕様はここまで