2009-02-09 7 views
8

Szukałem przez niektóre kodu z biblioteki SDL i natknąłem funkcja zadeklarowana następująco:Co robi deklaracja "CALLBACK" w C?

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

Teraz jestem programistą Delphi. No hablo C muy bien, senor. Ale pamiętam wystarczająco dużo składni z moich kursów w college'u, aby przeczytać to tak:

Nazwa funkcji to WndProc. Lista argumentów jest dość oczywista. Typ powrotu funkcji to LRESULT. Ale co w tym świecie robi to "CALLBACK"? W Delphi każda funkcja może być używana jako wywołanie zwrotne; wystarczy podać odpowiedni typ wskaźnika funkcji. Czy istnieje jakiś szczególny powód, dla którego C nie działa w ten sposób? Czy to oznacza coś innego?

Odpowiedz

2

To konwencja powołanie. Jest to wymagane, gdy przekazujesz wskaźnik do tej funkcji do interfejsu API systemu Windows, który później wywołuje tę funkcję. Konwencja wywołująca system Windows różni się od konwencji wywoływania C, dlatego należy określić kompilatorowi, że funkcja WndProc() jest wyjątkowa oraz że wymaga innego kodu uruchamiania i czyszczenia.

0

Jest to konwencja telefoniczna, a także Delphi. Spróbuj wyszukać "cdecl" w Pomocy Delphi. W Delphi (lub Object Pascal, jak staramy się to nazywać) konwencje wywoływania przychodzą po deklaracji funkcji, jak to;

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

Krótki Roundup od Raymond Chen blogu:

Wspaniałą rzeczą nazywając konwencje na platformie x86 jest , że istnieje tak wiele do wyboru!

konwencja wywołania C (__cdecl)

C konwencja wywołującego jest ograniczona, ponieważ pozwala on na użycie funkcji ze zmienną liczbą parametrów. To prawie wymaga, aby stos był wywoływany przez wywoływanie i aby parametry były popychane od prawej do lewej, tak aby pierwszy parametr znajdował się w ustalonej pozycji względem wierzchołka stosu. Podsumowując: Caller czyści stos, parametry popchnięte od prawej do lewej.

Pascal konwencja wywoływania (__pascal)

Pascal nie obsługuje funkcji o zmiennej liczbie parametrów, więc można go używać konwencji wywoływanego czyszczeniu. Parametry są popychane od lewej do prawej. Niemal wszystkie funkcje Win16 są eksportowane jako konwencja wywoływania Pascala. Konwencja "callee-clean" zapisuje trzy bajty w każdym punkcie wywołania ze stałym obciążeniem wynoszącym dwa bajty na funkcję. Był również frakcyjnie szybszy. W Win16 zapisanie kilkuset bajtów i kilku cykli było wielką sprawą. Uwaga: Konwencja wywołania Fortran (__fortran) jest taka sama, jak konwencja wywoływania usługi Pascal: