WINAPI

WINAPI見windef.h這個頭文件

含義

#define WINAPI __stdcall

  

 

  默認情況下,我們的函數調用都是遵循__stdcall這個規則的。當然,也有諸如__cdecl、__pascal等規則。

 

  使用__stdcall還是__cdecl或__pascal,在純Windows編程下並非特別需要。

 

  __stdcall:

 

  1、進行函數調用,函數參數的入棧方式是最右邊先入棧。

 

  2、同時__stdcall規定,子函數負責棧的回收(調用者只負責壓棧). 題外話:__pascal的調用規則是從左到右,正好與__stdcall相反。

 

  3、C調用約定(即用__cdecl關鍵字說明)(The C default calling convention)按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對於傳送參數的內存棧是由調用者來維護的(正因爲如此,實現可變參數vararg的函數(如printf)只能使用該調用約定)當然,這些工作是應用程序自己完成的,不需要編寫者動手。彙編語言另當別論(POP SP POP BP等) 。另外,在函數名修飾約定方面也有所不同。 _cdecl是C和C++程序的缺省調用方式。每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。函數採用從右到左的壓棧方式。VC將函數編譯後會在函數名前面加上下劃線前綴。

MFC缺省調用約定

在函數調用過程中,會使用棧。__stdcall與__cdecl是兩種不同的函數調用約定,定義了函數參數入棧的順序,由調用函數還是被調用函數將參數彈出棧,以及產生函數修飾名的方法。關於這兩個調用約定的詳細信息,讀者可參看MSDN。對於參數個數可變的函數,例如printf,使用的是__cdecl調用約定,Win32的API函數都遵循__stdcall調用約定。在VC++開發環境中,默認的編譯選項是__cdecl,對於那些需要__stdcall調用約定的函數,在聲明時必須顯式地加上__stdcall。在Windows程序中,回調函數必須遵循__stdcall調用約定,所以我們在聲明回調函數時要使用CALLBACK。使用CALLBACK而不是__stdcall的原因是爲了告訴我們這是一個回調函數。注意,在Windows 98和Windows 2000下,聲明窗口過程函數時,即使不使用CALLBACK也不會出錯,但在Windows NT4.0下,則會出錯

發佈了12 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章