2009-02-09 55 views
8

我一直在尋找通過從SDL庫一些代碼,跨功能來聲明如下:C中的「CALLBACK」聲明是做什麼的?

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

現在,我是一個Delphi編碼器。沒有hablo C muy bien,傳感器。但我記得我的大學課程有足夠的語法來讀取它:

函數名稱是WndProc。參數列表非常明瞭。函數返回類型是LRESULT。但是在這個世界上,那個「CALLBACK」在那裏呢?在Delphi中,任何函數都可以用作回調函數;你只需要傳遞正確類型的函數指針。 C有沒有什麼特別的理由不以這種方式工作?或者這意味着什麼不同?

回答

2

它的調用約定。將指向此函數的指針傳遞給稍後調用該函數的Windows API時,這是必需的。 Windows調用約定與C調用約定不同,因此您需要向編譯器指定WndProc()是特殊的,並且它需要不同的啓動和清理代碼。

0

這是一個調用約定,德爾福也有它們。嘗試在Delphi幫助中查找'cdecl'。在Delphi中(或者我們老年人喜歡稱之爲Object Pascal)的調用約定來自函數聲明之後,就像這樣;

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

短圍捕從Raymond Chen的博客:

的偉大的事情有關調用在x86平臺上 約定是 ,有這麼多的選擇!

C調用約定(__cdecl)

C調用約定被約束,因爲它允許用的參數的可變數量的使用功能。它幾乎要求將堆棧調用清理,並將參數從右向左推,以使第一個參數位於相對於堆棧頂部的固定位置。總結:調用者清理堆棧,參數從右向左推。

Pascal調用約定(__pascal

帕斯卡不支持的功能與參數的可變數量,因此它可以使用被叫方清潔約定。參數從左向右推。幾乎所有的Win16函數都作爲Pascal調用約定輸出。被調用者清除約定在每個調用點保存三個字節,每個函數的固定開銷爲兩個字節。它也快一些。在Win16上,節省幾百字節和幾個週期是一件大事。注意:Fortran調用約定(__fortran)與Pascal調用約定相同

相關問題