2009年9月9日

PASCAL and WINAPI 的用意

VC有兩種函數調用方式 一種是__stdcall,另一種是__cdecl,函數的調用方式有兩種一種是PASCAL調用方式,另一種是C調用方式。
使用PASCAL調用方式,函數在返回到調用者之前將參數從棧中刪除。
使用C調用方式,參數的刪除是調用者完成的。

WinMain函數是由系統調用的,Windows系統規定由系統調用的函數都遵守PASCAL調用方式,但是VC中函數的缺省調用方式是__cdecl,也就是C調用方式所以在WinMain前顯示的聲明:
int PASCAL WinMain(HINSTANCE hInstC, HINSTANCE hInstP, LPSTR lpCmdLine, int nCmdShow)
{
//
}

在Windows編程中將遇到很多聲明修飾符,如CALLBACK,WINAPI,PASCAL這些在IntelCPU的計算機上都是__stdcall,詳細的聲明細節可以參考windef.h :

#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall

然而 __stdcall 只能擁有固定的參數數量,若需要使用可變動的參數就要使用 __cdecl。

沒有留言: