Export (0) Print
Expand All


Microsoft Specific

__cdecl is the default calling convention for C and C++ programs. Because the stack is cleaned up by the caller, it can do vararg functions. 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.



Argument-passing order

Right to left.

Stack-maintenance responsibility

Calling function pops the arguments from the stack.

Name-decoration convention

Underscore character (_) is prefixed to names, except when __cdecl functions that use C linkage are exported.

Case-translation convention

No case translation performed.

Note Note

For related information, see Decorated Names.

Place the __cdecl modifier before a variable or a function name. 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. The /Gd compiler option forces the __cdecl calling convention.

On ARM and x64 processors, __cdecl is accepted but typically ignored by the compiler. By convention on ARM and x64, arguments are passed in registers when possible, and subsequent arguments are passed on the stack. In x64 code, use __cdecl to override the /Gv compiler option and use the default x64 calling convention.


struct CMyClass {
   void __cdecl mymethod();


void CMyClass::mymethod() { return; }

is equivalent to this:

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

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

Community Additions

© 2014 Microsoft