__cdecl

__cdecl は、C および C++ プログラムの既定の呼び出し規則です。 スタックは呼び出し元によってクリーンアップされるため、vararg 関数を実行できます。 __cdecl 呼び出し規則は、各関数呼び出しにスタック クリーンアップ コードを含めるように要求するため、__stdcall よりも大きな実行可能ファイルを作成します。 次の一覧は、この呼び出し規約の実装例を示しています。 __cdecl 修飾子は Microsoft 固有です。

要素 実装
引数を渡す順序 右から左。
スタック メンテナンスの役割 呼び出し元の関数によって、スタックから引数がポップされます。
名前装飾規約 C リンケージを使用する __cdecl 関数をエクスポートする場合を除いて、アンダースコア (_) 文字が名前の前に付けられます。
大文字と小文字の変換規約 大文字小文字は変換されません。

Note

関連情報については、「装飾名」を参照してください。

変数名または関数名の前に __cdecl 修飾子を置きます。 C の名前と呼び出し規則は既定であるため、__cdecl を x86 コードで使用する必要があるのは、/Gv (vectorcall)、/Gz (stdcall)、または /Gr (fastcall) コンパイラ オプションを指定したときだけです。 /Gd コンパイラ オプションは、__cdecl 呼び出し規則を強制的に適用します。

ARM と x64 のプロセッサでは、__cdecl はコンパイラによって受け入れられますが、通常は無視されます。 ARM と x64 の規約に基づいて、引数は可能であればレジスタで渡され、残りの引数はスタックで渡されます。 x64 コードでは、__cdecl を指定することで、/Gv コンパイラ オプションをオーバーライドし、既定の x64 呼び出し規則を使用します。

静的でないクラス関数がアウトオブラインで宣言されている場合、アウトオブラインの宣言で呼び出し規約の修飾子を指定する必要はありません。 つまり、クラスの静的でないメンバー メソッドの場合は、宣言時に指定された呼び出し規約が定義の時点で仮定されます。 次のクラス定義があるとします。

struct CMyClass {
   void __cdecl mymethod();
};

ここで、

void CMyClass::mymethod() { return; }

は次の記述と同じです。

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

以前のバージョンとの互換性を確保するために、cdecl および _cdecl は、コンパイラ オプション /Za (言語拡張機能の無効化) が指定されていない限り、__cdecl の同意語です。

次の例では、コンパイラは、system 関数に対して C の命名規則と呼び出し規則を使用するように指示されます。

// Example of the __cdecl keyword on function
int __cdecl system(const char *);
// Example of the __cdecl keyword on function pointer
typedef BOOL (__cdecl *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);

関連項目

引数の渡し規則と名前付け規則
キーワード