2009-02-09 9 views
8

Je regardais à travers un code de la bibliothèque SDL et suis tombé sur une fonction déclarée comme ceci:Que fait une déclaration "CALLBACK" en C?

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

Maintenant, je suis un codeur Delphi. Pas de hablo C muy bien, senor. Mais je me souviens assez de la syntaxe de mes cours de collège pour le lire comme ceci:

Le nom de la fonction est WndProc. La liste des arguments est assez explicite. Le type de retour de la fonction est LRESULT. Mais qu'est-ce que "CALLBACK" fait dans le monde? En Delphi, n'importe quelle fonction peut être utilisée comme un rappel; vous avez juste besoin de passer le bon type de pointeur de fonction. Y a-t-il une raison particulière pour laquelle C ne fonctionne pas de cette façon? Ou cela signifie-t-il quelque chose de différent?

Répondre

2

C'est la convention d'appel. Il est requis lorsque vous passez un pointeur vers cette fonction à une API Windows qui appelle ultérieurement cette fonction. La convention d'appel Windows est différente de la convention d'appel C, donc vous devez spécifier au compilateur que WndProc() est spécial, et qu'il a besoin de différents codes de démarrage et de nettoyage.

0

C'est une convention d'appel, et Delphi en a aussi. Essayez de rechercher 'cdecl' dans l'aide de Delphi. En Delphi (ou Object Pascal comme nous l'appelons oldies), les conventions d'appel viennent après la déclaration de la fonction, comme ceci;

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

tour d'horizon court du blog de Raymond Chen:

La grande chose au sujet d'appeler conventions sur la plate-forme x86 est qu'il ya tant de choix!

convention d'appel C (__cdecl)

La convention d'appel C est limité car il permet l'utilisation des fonctions avec un nombre variable de paramètres. Il faut à peu près que la pile soit nettoyée par l'appelant et que les paramètres soient poussés de droite à gauche, de sorte que le premier paramètre soit à une position fixe par rapport au haut de la pile. En résumé: L'appelant nettoie la pile, les paramètres sont poussés de droite à gauche.

Pascal convention d'appel (__pascal)

Pascal ne prend pas en charge les fonctions avec un nombre variable de paramètres, il peut donc utiliser la convention-propre callee. Les paramètres sont poussés de gauche à droite. Presque toutes les fonctions Win16 sont exportées en convention d'appel Pascal. La convention callee-clean enregistre trois octets à chaque point d'appel, avec une surcharge de deux octets par fonction. Il était également plus rapide. Sur Win16, économiser quelques centaines d'octets et quelques cycles était une grosse affaire. Note: La convention d'appel Fortran (__fortran) est la même que la convention d'appel Pascal