__stdcall__stdcall

Específicos de MicrosoftMicrosoft Specific

El __stdcall convención de llamada se usa para llamar a funciones API de Win32.The __stdcall calling convention is used to call Win32 API functions. El destinatario limpia la pila, por lo que hace que el compilador vararg funciones __cdecl.The callee cleans the stack, so the compiler makes vararg functions __cdecl. Las funciones que usan esta convención de llamada requieren un prototipo de función.Functions that use this calling convention require a function prototype.

SintaxisSyntax

return-type __stdcall function-name[( argument-list )]return-type __stdcall function-name[( argument-list )]

ComentariosRemarks

En la lista siguiente se muestra la implementación de esta convención de llamada.The following list shows the implementation of this calling convention.

ElementoElement ImplementaciónImplementation
Orden de paso de argumentoArgument-passing order De derecha a izquierda.Right to left.
Convención para pasar argumentosArgument-passing convention Por valor, a menos que se pase un puntero o un tipo de referencia.By value, unless a pointer or reference type is passed.
Responsabilidad de mantenimiento de pilaStack-maintenance responsibility La función a la que se llama saca sus propios argumentos de la pila.Called function pops its own arguments from the stack.
Convención de creación de nombres representativosName-decoration convention Un subrayado () precede al nombre.An underscore () is prefixed to the name. El nombre va seguido del signo @ seguido del número de bytes (en decimal) en la lista de argumentos.The name is followed by the at sign (@) followed by the number of bytes (in decimal) in the argument list. Por consiguiente, la función declarada como int func( int a, double b ) se representa de la manera siguiente: _func@12Therefore, the function declared as int func( int a, double b ) is decorated as follows: _func@12
Convención de traducción de mayúsculas y minúsculasCase-translation convention NingunaNone

El /Gz especifica la opción del compilador __stdcall para todas las funciones no declaradas explícitamente con otra convención de llamada.The /Gz compiler option specifies __stdcall for all functions not explicitly declared with a different calling convention.

Para ofrecer compatibilidad con versiones anteriores, _stdcall es un sinónimo de __stdcall a menos que la opción de compilador /Za (deshabilitar extensiones de lenguaje) es especificado.For compatibility with previous versions, _stdcall is a synonym for __stdcall unless compiler option /Za (Disable language extensions) is specified.

Las funciones declaradas con el __stdcall del mismo modo que las funciones declaradas con los valores de modificador devuelto __cdecl.Functions declared using the __stdcall modifier return values the same way as functions declared using __cdecl.

En ARM y x64 procesadores, __stdcall acepta y omite el compilador; en ARM y x64 arquitecturas, por convención, los argumentos se pasan en registros cuando sea posible, y los argumentos subsiguientes se pasan en la pila.On ARM and x64 processors, __stdcall is accepted and ignored by the compiler; on ARM and x64 architectures, by convention, arguments are passed in registers when possible, and subsequent arguments are passed on the stack.

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.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. 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.That is, for class non-static member methods, the calling convention specified during declaration is assumed at the point of definition. Dada esta definición de clase,Given this class definition,

struct CMyClass {
   void __stdcall mymethod();
};

thisthis

void CMyClass::mymethod() { return; }

equivale a estois equivalent to this

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

EjemploExample

En el ejemplo siguiente, el uso de __stdcall da como resultado todos WINAPI tipos de función que se tratan como una llamada estándar:In the following example, use of __stdcall results in all WINAPI function types being handled as a standard call:

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

Vea tambiénSee also

Paso de argumentos y convenciones de nomenclaturaArgument Passing and Naming Conventions
Palabras claveKeywords