__cdeclは、C およびC++プログラムの既定の呼び出し規約です。__cdecl is the default calling convention for C and C++ programs. スタックは呼び出し元によってクリーンアップされるため、vararg 関数を実行できます。Because the stack is cleaned up by the caller, it can do vararg functions. __Cdecl呼び出し規約では、 __stdcallよりも大きな実行可能ファイルが作成されます。これは、各関数呼び出しにスタッククリーンアップコードを含める必要があるためです。The __cdecl calling convention creates larger executables than __stdcall, because it requires each function call to include stack cleanup code. 次の一覧は、この呼び出し規約の実装例を示しています。The following list shows the implementation of this calling convention. __Cdecl修飾子は Microsoft 固有です。The __cdecl modifier is Microsoft-specific.

要素Element 実装Implementation
引数を渡す順序Argument-passing order 右から左。Right to left.
スタック メンテナンスの役割Stack-maintenance responsibility 呼び出し元の関数によって、スタックから引数がポップされます。Calling function pops the arguments from the stack.
名前装飾規約Name-decoration convention C リンケージを使用する _cdecl 関数がエクスポートされる場合を除き、アンダースコア文字 () は名前の前に付加されます。Underscore character (_) is prefixed to names, except when __cdecl functions that use C linkage are exported.
大文字と小文字の変換規約Case-translation convention 大文字小文字は変換されません。No case translation performed.


関連情報については、「装飾名」を参照してください。For related information, see Decorated Names.

__Cdecl修飾子を変数または関数名の前に配置します。Place the __cdecl modifier before a variable or a function name. C の名前と呼び出し規約は既定であるため、x86 コードで __cdeclを使用する必要があるのは、/Gv (vectorcall)、/Gz (stdcall)、または /Gr (fastcall) コンパイラオプションを指定した場合のみです。Because the C naming and calling conventions are the default, the only time you must use __cdecl in x86 code is when you have specified the /Gv (vectorcall), /Gz (stdcall), or /Gr (fastcall) compiler option. /Gdコンパイラオプションは __cdeclの呼び出し規約を強制的に実行します。The /Gd compiler option forces the __cdecl calling convention.

ARM および x64 プロセッサでは、 __cdeclは受け入れられますが、通常はコンパイラによって無視されます。On ARM and x64 processors, __cdecl is accepted but typically ignored by the compiler. ARM と x64 の規約に基づいて、引数は可能であればレジスタで渡され、残りの引数はスタックで渡されます。By convention on ARM and x64, arguments are passed in registers when possible, and subsequent arguments are passed on the stack. X64 コードでは、 __cdeclを使用して /Gvコンパイラオプションをオーバーライドし、既定の x64 呼び出し規約を使用します。In x64 code, use __cdecl to override the /Gv compiler option and use the default x64 calling convention.

静的でないクラス関数がアウトオブラインで宣言されている場合、アウトオブラインの宣言で呼び出し規約の修飾子を指定する必要はありません。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 __cdecl mymethod();


void CMyClass::mymethod() { return; }

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

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

以前のバージョンとの互換性のために、コンパイラオプション/za (無効になっている言語拡張)が指定されていない限り、 cdecl_cdecl__cdeclのシノニムになります。For compatibility with previous versions, cdecl and _cdecl are a synonym for __cdecl unless compiler option /Za (Disable language extensions) is specified.


次の例では、コンパイラは、system 関数に対して C の命名規則と呼び出し規則を使用するように指示されます。In the following example, the compiler is instructed to use C naming and calling conventions for the system function.

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

参照See also

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