當前位置:菜譜大全網 - 菜譜 - 興城什麽餐廳吃起來便宜?

興城什麽餐廳吃起來便宜?

WINAPI和回調有什麽區別?_stdcall_cdecl_pascal_fastcall這些關鍵字是什麽意思?有什麽區別?

首先看看MSDN給出的解釋,但是有些解釋很模糊,WINAPI。

使用於placeoffarpascalipadiclarations。如果yourewritingadlwithexportadapientrypoints,則youcanusethisforyourownAPIs。回收

useinplaceoffarpascalinapplicationcallbackroutinsuchwindow procedures和dialogprocedures。我們來看看這兩個宏的內容是什麽,VC:WINDEF.h

# definecallbackPascal/= _pascal,VC不再支持直接使用_pascal。

# defineWINAPICDECL//= _ cdeclBCB:windef . h

#defineCALLBACK__stdcall

#defineWINAPI__stdcall引出壹些可能比較少見的關鍵字,比如cdeclstdcall。那麽cdecl、pascal、stdcall、fastcall這些修飾符是什麽意思呢?

很簡單,只是壹些關於堆棧的解釋,首先是函數參數的堆棧順序,其次是

誰來清除堆棧的內容,調用者還是函數本身?

這些開關用來告訴編譯器產生哪種匯編代碼。以下區別列表如下:directiveparameteorderclean-UppercassesparameterSinRegisters?

註冊從左到右路線是

pascalLeft-to-rightRoutineNo

cdeclRight-to-leftCallerNo

stdcallRight從右向左路由否

SafecallRight-to-leftRoutineNo簡單描述:__cdecl是C/C++和MFC程序默認使用的調用約定,也可以通過在函數聲明中添加__cdecl關鍵字來手動指定。采用__cdecl約定時,函數參數從右到左放入堆棧,調用者將參數彈出堆棧以清理堆棧。因此,實現可變參數的函數只能使用這種調用約定。因為每個使用__cdecl約定的函數都包含清理堆棧的代碼,所以生成的可執行文件會相對較大。__cdecl可以寫成_cdecl。

__stdcall調用約定用於調用Win32API函數。采用__stdcal約定時,函數參數從右向左放入堆棧,被調用的函數在返回前清理傳遞參數的堆棧,函數參數個數固定。因為函數體本身知道傳遞參數的個數,所以被調用的函數在返回之前可以直接用retn指令清理傳遞參數的堆棧。__stdcall可以寫成_stdcall。

__fastcall約定用於對性能要求非常高的情況。__fastcall約定將函數的兩個參數從左邊開始,大小不超過4字節(DWORD)分別放在ECX和EDX寄存器中,其余參數仍在堆棧上從右向左傳輸。被調用的函數在返回之前清理被傳遞參數的堆棧。__fastcall可以寫成_fastcall。

特殊說明

1.默認情況下,采用__cdecl模式,因此可以省略。

2.WINAPI壹般用於修飾動態鏈接庫中的導出函數。

3.回調只用於修飾回調函數。

4.妳可能發現VC和BCB下WINAPI的定義是不壹樣的,所以至少妳懂了。

我們不能從BCB直接調用VC的dll的壹個原因。