__stdcall
La convención de llamada __stdcall
se usa para llamar a funciones de la API de Win32. El destinatario limpia la pila, por lo que el compilador hace funciones vararg
__cdecl
. Las funciones que usan esta convención de llamada requieren un prototipo de función. El modificador __stdcall
es específico de Microsoft.
Sintaxis
return-type
__stdcall
function-name[(
argument-list)
]
Comentarios
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. |
Convención para pasar argumentos | Por valor, a menos que se pase un puntero o un tipo de referencia. |
Responsabilidad de mantenimiento de pila | La función a la que se llama saca sus propios argumentos de la pila. |
Convención de creación de nombres representativos | Un subrayado (_ ) precede al nombre. El nombre va seguido del signo (@ ) seguido del número de bytes (en decimal) en la lista de argumentos. Por consiguiente, la función declarada como int func( int a, double b ) se representa de la manera siguiente: _func@12 |
Convención de traducción de mayúsculas y minúsculas | Ninguno |
La opción del compilador /Gz especifica __stdcall
para todas las funciones no declaradas explícitamente con otra convención de llamada.
A efectos de compatibilidad con versiones anteriores, _stdcall
es un sinónimo de __stdcall
a menos que se especifique la opción del compilador /Za
(Deshabilitar extensiones de lenguaje).
Las funciones declaradas con el modificador __stdcall
devuelven valores del mismo modo que las funciones declaradas con __cdecl
.
En procesadores ARM y x64, el compilador acepta y omite __stdcall
; en las arquitecturas ARM y x64, por convención, los argumentos se pasan en registros cuando es posible y los argumentos subsiguientes se pasan en la pila.
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 __stdcall mymethod();
};
this
void CMyClass::mymethod() { return; }
equivale a esto
void __stdcall CMyClass::mymethod() { return; }
Ejemplo
En el ejemplo siguiente, el uso de __stdcall
da como resultado que todos los tipos de función WINAPI
se controlen como una llamada estándar:
// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);
Consulte también
Paso de argumentos y convenciones de nomenclatura
Palabras clave
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de