una - deduccion vivienda habitual 2017
¿Qué hace una declaración "CALLBACK" en C? (4)
Estaba buscando un código de la biblioteca SDL y encontré una función declarada así:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Ahora, soy un codificador 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?
Breve resumen del Blog de Raymond Chen:
¡Lo mejor de las convenciones de llamadas en la plataforma x86 es que hay tantos para elegir!
Convención de llamada C (__cdecl)
La convención de llamadas C está restringida porque 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.
Convención de llamadas Pascal (__pascal )
Pascal no admite funciones con un número variable de parámetros, por lo que puede utilizar la convención de llamada de limpieza. 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 unos pocos 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
El "CALLBACK" es una convención de llamadas. Hay otros tipos de convenciones de llamadas. CALLBACK es lo mismo que __stdcall.
http://www.codeguru.com/cpp/cpp/cpp_mfc/callbacks/article.php/c10557
Algo más de información en el blog de Raymond Chen:
http://blogs.msdn.com/oldnewthing/archive/2004/01/08/48616.aspx
Es la convención de llamadas. 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.
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;