2009-02-09 21 views
8

que estaba buscando a través de un código de la biblioteca SDL y me encontré con una función declarada como esto:¿Qué significa una declaración "CALLBACK" en C?

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 

Ahora, yo soy un programador de Delphi. No hablo C muy bien, señor. Pero recuerdo suficiente sintaxis de mis cursos universitarios para leerlo así:

El nombre de la función es WndProc. La lista de argumentos es bastante autoexplicativa. El tipo de devolución de función es LRESULT. Pero, ¿qué demonios está haciendo "CALLBACK" allí? En Delphi, cualquier función puede usarse como una devolución de llamada; solo necesita pasar el tipo correcto de puntero a la función. ¿Hay alguna razón particular por la cual C no funciona de esa manera? ¿O significa algo diferente?

Respuesta

2

Es la convención de llamada. Es necesario cuando pasa un puntero a esta función a una API de Windows que luego llama a esa función. La convención de llamadas de Windows es diferente de la convención de llamadas de C, por lo tanto, debe especificar al compilador que WndProc() es especial y que necesita un código de inicio y limpieza diferente.

0

Es una convención de llamadas, y Delphi también las tiene. Intente buscar 'cdecl' en la Ayuda de Delphi. En Delphi (o Object Pascal, como nos gusta llamarlo), las convenciones de llamada vienen después de la declaración de la función, como esta;

function MyFunction(X, Y: Real): Real; cdecl; 
4

rodeo corto del blog de Raymond Chen:

La gran cosa acerca de llamar convenciones en la plataforma x86 es que hay tantos para elegir!

convención de llamada de C (__cdecl)

la convención de llamada C se ve limitada debido a que permite el uso de funciones con un número variable de parámetros. Basicamente requiere que la pila sea limpiada por la persona que llama y que los parámetros sean empujados de derecha a izquierda, de modo que el primer parámetro esté en una posición fija con respecto a la parte superior de la pila. En resumen: el que llama limpia la pila, los parámetros se presionan de derecha a izquierda.

Pascal convención de llamada (__pascal)

Pascal no soporta funciones con un número variable de parámetros, por lo que puede utilizar la convención destinatario de la llamada-limpio. Los parámetros se empujan de izquierda a derecha. Casi todas las funciones de Win16 se exportan como convención de llamadas Pascal. La convención callee-clean ahorra tres bytes en cada punto de llamada, con una sobrecarga fija de dos bytes por función. También fue fraccionalmente más rápido. En Win16, ahorrar unos pocos cientos de bytes y algunos ciclos fue un gran problema. Nota: La convención de llamadas de Fortran (__fortran) es la misma que la convención de llamadas de Pascal

Cuestiones relacionadas