__stdcall
__stdcall
呼び出し規則は、Win32 API 関数の呼び出しに使用されます。 呼び出し先がスタックを消去するため、コンパイラは vararg
関数を __cdecl
にします。 この呼び出し規則を使用する関数には、関数プロトタイプが必要です。 __stdcall
修飾子は Microsoft 固有です。
構文
return-type
__stdcall
function-name[(
argument-list)
]
解説
次の一覧は、この呼び出し規約の実装例を示しています。
要素 | 実装 |
---|---|
引数を渡す順序 | 右から左。 |
引数渡し規約 | ポインターまたは参照型が渡されない場合は、値渡し。 |
スタック メンテナンスの役割 | 呼び出された関数が、自分の引数をスタックからポップします。 |
名前装飾規約 | 名前の前にアンダースコア (_ ) が付けられます。 名前の後に、アット マーク (@ ) と、引数リストのバイト数 (10 進数) が続きます。 したがって、int func( int a, double b ) として宣言された関数は次のように修飾されます: _func@12 |
大文字と小文字の変換規約 | なし |
/Gz コンパイラ オプションは、明示的に異なる呼び出し規則で宣言されていないすべての関数に対して __stdcall
を指定します。
以前のバージョンとの互換性を確保するために、_stdcall
は、コンパイラ オプション /Za
(言語拡張機能の無効化) が指定されていない限り、__stdcall
の同意語です。
__stdcall
修飾子を使って宣言された関数は、__cdecl
を使って宣言された関数と同じ方法で値を返します。
ARM および x64 プロセッサでは、__stdcall
はコンパイラによって受け入れられるか無視されます。ARM および x64 アーキテクチャでは規約によって可能な限り引数はレジスタで渡され、その後の引数はスタックで渡されます。
静的でないクラス関数がアウトオブラインで宣言されている場合、アウトオブラインの宣言で呼び出し規約の修飾子を指定する必要はありません。 つまり、クラスの静的でないメンバー メソッドの場合は、宣言時に指定された呼び出し規約が定義の時点で仮定されます。 次のクラス定義の場合、
struct CMyClass {
void __stdcall mymethod();
};
this
void CMyClass::mymethod() { return; }
は次の記述と同じです。
void __stdcall CMyClass::mymethod() { return; }
例
次の例では、__stdcall
の使用により、すべての WINAPI
関数型が標準呼び出しとして処理されます。
// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);