Microsoft 固有の仕様Microsoft Specific

_ _Stdcall呼び出し規約は、Win32 API 関数を呼び出すには使用できます。The __stdcall calling convention is used to call Win32 API functions. コンパイラは、呼び出し先がスタックを消去vararg関数 _ _cdeclします。The callee cleans the stack, so the compiler makes vararg functions __cdecl. この呼び出し規則を使用する関数には、関数プロトタイプが必要です。Functions that use this calling convention require a function prototype.


return-type __stdcall function-name[( argument-list )]return-type __stdcall function-name[( argument-list )]


次の一覧は、この呼び出し規則の実装例を示しています。The following list shows the implementation of this calling convention.

要素Element 実装Implementation
引数を渡す順序Argument-passing order 右から左。Right to left.
引数渡し規約Argument-passing convention ポインターまたは参照型が渡されない場合は、値渡し。By value, unless a pointer or reference type is passed.
スタック メンテナンスの役割Stack-maintenance responsibility 呼び出された関数が、自分の引数をスタックからポップします。Called function pops its own arguments from the stack.
名前装飾規約Name-decoration convention アンダースコア () は、名前の前に付けられます。An underscore () is prefixed to the name. 名前の後に、アットマーク (@) と、引数リストのバイト数 (10 進数) が続きます。The name is followed by the at sign (@) followed by the number of bytes (in decimal) in the argument list. したがって、int func( int a, double b ) として宣言された関数は次のように修飾されます: _func@12Therefore, the function declared as int func( int a, double b ) is decorated as follows: _func@12
大文字と小文字の変換規約Case-translation convention なしNone

/Gzコンパイラ オプションを指定します _ _stdcall異なる呼び出し規則で明示的に宣言されたすべての関数。The /Gz compiler option specifies __stdcall for all functions not explicitly declared with a different calling convention.

以前のバージョンとの互換性のため _stdcallのシノニムです _ _stdcallしない限り、コンパイラ オプション/Za(言語拡張機能を無効にする)は指定します。For compatibility with previous versions, _stdcall is a synonym for __stdcall unless compiler option /Za (Disable language extensions) is specified.

使用して宣言された関数、 _ _stdcall修飾子の戻り値を使用して宣言された関数と同じ方法_ _cdeclします。Functions declared using the __stdcall modifier return values the same way as functions declared using __cdecl.

ARM と x64 プロセッサでは、 _ _stdcallが受け入れられ、無視されます、コンパイラでは、ARM および x64 アーキテクチャでは、慣例により、引数が可能であれば、レジスタで渡され、後続の引数はスタックで渡されます。On ARM and x64 processors, __stdcall is accepted and ignored by the compiler; on ARM and x64 architectures, by convention, arguments are passed in registers when possible, and subsequent arguments are passed on the stack.

静的でないクラス関数がアウトオブラインで宣言されている場合、アウトオブラインの宣言で呼び出し規則の修飾子を指定する必要はありません。For non-static class functions, if the function is defined out-of-line, the calling convention modifier does not have to be specified on the out-of-line definition. つまり、クラスの静的でないメンバー メソッドの場合は、宣言時に指定された呼び出し規則が定義の時点で仮定されます。That is, for class non-static member methods, the calling convention specified during declaration is assumed at the point of definition. 次のクラス定義の場合、Given this class definition,

struct CMyClass {
   void __stdcall mymethod();


void CMyClass::mymethod() { return; }

は次の記述と同じです。is equivalent to this

void __stdcall CMyClass::mymethod() { return; }


次の例での使用 _ _stdcallすべてWINAPI標準呼び出しとして処理される関数の型します。In the following example, use of __stdcall results in all WINAPI function types being handled as a standard call:

// 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, ...);

関連項目See also

引数の渡し規則と名前付け規則Argument Passing and Naming Conventions