引数の渡し規則と名前付け規則

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 固有の仕様はここまで

関連項目

呼び出し規約