引数の渡し規則と名前付け規則
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++ コンパイラでサポートされます。
キーワード |
スタック クリーンアップ |
パラメーター渡し |
---|---|---|
Caller |
パラメーターをスタックに逆の順序で (右から左に) プッシュする |
|
適用なし |
CLR 式スタックに順に (左から右に) パラメーターを読み込む |
|
Callee |
パラメーターをスタックに逆の順序で (右から左に) プッシュする |
|
Callee |
レジスタに格納されてから、スタックにプッシュされる |
|
Callee |
スタックにプッシュされる (ECX 内に格納されている this ポインター) |
|
Callee |
レジスタに格納されてから、スタックに逆の順序で (右から左に) プッシュされる |
関連情報については、「廃止された呼び出し規約」を参照してください。
END Microsoft 固有の仕様