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

Microsoft 固有の仕様 →

Visual C++ コンパイラでは、関数と呼び出し元の間の、引数と戻り値の受け渡しに関する規約を指定することができます。 サポートされるすべてのプラットフォームですべての規約がサポートされるわけではありません。また、一部の規約は、プラットフォーム固有の実装を使用します。 ほとんどの場合、特定のプラットフォームでサポートされていない規約を指定するキーワードやコンパイラ スイッチは無視され、プラットフォームの既定の規約が使用されます。

x86 プラットフォームでは、すべての引数は渡されたときに 32 ビットに拡大変換されます。 EDX:EAX レジスタ ペアに返される 8 バイトの構造体を除き、戻り値も 32 ビットに拡張され、EAX レジスタに返されます。 より大きな構造体は、非表示の戻り値の構造体へのポインターとして EAX レジスタに返されます。 パラメーターは、スタックに右から左へプッシュされます。 POD ではない構造体はレジスタ内では返されません。

コンパイラは、関数で ESI、EDI、EBX、および EBP レジスタが使用されている場合、それらを保存および復元するためにプロローグ コードとエピローグ コードを生成します。

注意

構造体、共用体、またはクラスが値渡しで関数から戻される場合は、型のすべての定義が同じである必要があります。そうでないと、実行時にプログラムが失敗することがあります。

独自の関数プロローグおよびエピローグ コードを定義する方法については、「naked 関数の呼び出し」を参照してください。

x64 プラットフォームを対象としたコードでの既定の呼び出し規約については、「x64 呼び出し規約の概要」を参照してください。 ARM プラットフォームを対象としたコードでの呼び出し規約の問題については、「Visual C++ の ARM への移行に関する一般的な問題」を参照してください。

次の呼び出し規約は Visual C/C++ コンパイラでサポートされます。

キーワード

スタック クリーンアップ

パラメーター渡し

__cdecl

Caller

パラメーターをスタックに逆の順序で (右から左に) プッシュする

__clrcall

適用なし

CLR 式スタックに順に (左から右に) パラメーターを読み込む

__stdcall

Callee

パラメーターをスタックに逆の順序で (右から左に) プッシュする

__fastcall

Callee

レジスタに格納されてから、スタックにプッシュされる

__thiscall

Callee

スタックにプッシュされる (ECX 内に格納されている this ポインター)

__vectorcall

Callee

レジスタに格納されてから、スタックに逆の順序で (右から左に) プッシュされる

関連情報については、「廃止された呼び出し規約」を参照してください。

END Microsoft 固有の仕様

参照

関連項目

呼び出し規約