__cdecl

__cdecl es la convención de llamada predeterminada de los programas C y C++. Como el autor de la llamada limpia la pila, puede realizar funciones vararg. La convención de llamada __cdecl crea archivos ejecutables mayores que __stdcall, porque requiere que cada llamada a función incluya código de limpieza de la pila. En la lista siguiente se muestra la implementación de esta convención de llamada. El modificador __cdecl es específico de Microsoft.

Elemento Implementación
Orden de paso de argumento De derecha a izquierda.
Responsabilidad de mantenimiento de pila Al llamar a la función, se extraen los argumentos de la pila.
Convención de creación de nombres representativos El carácter de subrayado (_) tiene como prefijo los nombres, excepto cuando se exportan __cdecl funciones que usan la vinculación de C.
Convención de traducción de mayúsculas y minúsculas No se lleva a cabo una traducción de mayúsculas y minúsculas.

Nota:

Para más información relacionada, consulte Nombres decorados.

Coloque el modificador __cdecl delante de una variable o nombre de función. Como las convenciones de llamada y nomenclatura de C son el valor predeterminado, la única vez que se debe usar __cdecl en código x86 es cuando se haya especificado la opción del compilador /Gv (vectorcall), /Gz (stdcall) o /Gr (fastcall). La opción del compilador /Gd fuerza la convención de llamada __cdecl.

En los procesadores ARM y x64, se acepta el uso de __cdecl, pero el compilador lo omite normalmente. Por convención en ARM y x64, los argumentos se pasan en registros siempre que es posible y los argumentos subsiguientes se pasan en la pila. En código x64, use __cdecl para invalidar la opción del compilador /Gv y usar la convención de llamada predeterminada de x64.

En el caso de funciones de clase no estáticas, si la función se define fuera de línea, no es necesario especificar el modificador de convención de llamada en la definición fuera de línea. Es decir, para los métodos miembro no estáticos de clase, en el momento de la definición se supone la convención de llamada especificada durante la declaración. Dada esta definición de clase:

struct CMyClass {
   void __cdecl mymethod();
};

esto:

void CMyClass::mymethod() { return; }

equivale a esto:

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

A efectos de compatibilidad con versiones anteriores, cdecl y _cdecl son sinónimo de __cdecl, a menos que se especifique la opción del compilador /Za (Deshabilitar extensiones de lenguaje).

Ejemplo

En el ejemplo siguiente, se le indica al compilador que utilice nombres y convenciones de llamada de C para la función system.

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

Consulte también

Paso de argumentos y convenciones de nomenclatura
Palabras clave