Compartir a través de


__cdecl

Específicos de Microsoft

__cdecl es la convención de llamada predeterminada de los programas C y C++. Como el llamador 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.

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 (_) precede a los nombres, excepto al exportar funciones __cdecl 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 obtener información relacionada, vea Nombres representativos.

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 para 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; }

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

Vea también

Referencia

Paso de argumentos y convenciones de nomenclatura

Palabras clave de C++