Q
何時使用調用約定
6
A
回答
12
大多數時候你不需要擔心它。通常你會使用__cdecl
,但只是因爲這是Visual C++中的默認值。但是,C++成員函數在默認情況下使用Visual C++
當您將回調傳遞給API函數(如Windows API中的函數)時,您確實需要擔心調用約定的一種(相當常見的)情況:
// CALLBACK is #define'd as __stdcall
LRESULT CALLBACK MyWndProc(HWND hwnd, UINT msg
WPARAM wParam, LPARAM lParam);
// ...
windowClass.lpfnWndProc = &MyWndProc;
::RegisterClass(&windowClass);
在這裏,我們聲明MyWndProc()
作爲具有__stdcall
約定(CALLBACK
是#define
倒是如__stdcall
)。這是因爲操作系統期望lpfnWndProc
指向WNDPROC
,which uses the CALLBACK
convention。
幾乎所有的Windows API,它接受一個回調函數需要回調函數使用__stdcall
慣例,而且由於__cdecl
通常是默認的,你必須更加明確,(你會使用CALLBACK
的窗口過程)。
這非常重要,因爲如果操作系統嘗試調用非__stdcall
函數,則可能會發生堆棧損壞。不幸的是,足夠的人得到這個錯誤Windows will actually check for calling convention mismatch specifically for window procedures。
雖然__stdcall
需要傳遞給WinAPI的函數回調函數,接受的參數個數可變必須使用__cdecl
調用約定,因爲只有調用者將知道如何正確地彈出可變數量的參數從堆棧功能。由於__cdecl
通常是默認值,因此您無需爲接受可變數量參數的函數明確指定__cdecl
。
我個人還沒有找到用於__fastcall
,雖然我確定有人有。
__clrcall
僅在您與託管代碼進行交互時纔有用。
相關問題
- 1. 如何使用Delphi中的「_pascal調用約定」調用dll?
- 2. ASM調用約定
- 3. 使用DLL調用約定錯誤
- 4. Objective C約定:何時使用For和何時使用With
- 5. 如何指定vc11 lambda調用約定
- 6. 使用套接字時函數調用約定的建議
- 7. x86 linux系統調用調用約定?
- 8. 使用調用約定fastcall的任何實際用例?
- 9. c中的調用約定
- 10. std :: sort&comp - 調用約定?
- 11. 在C++/CLI調用約定
- 12. 的Delphi thiscall調用約定
- 13. GCC cdecl調用約定
- 14. Char vs int調用約定
- 15. 調用約定錯誤 - C
- 16. 調用`〜`與前綴約定
- 17. 函數調用約定
- 18. Sparc程序調用約定
- 19. std :: function如何知道調用約定?
- 20. 如何使用BOOST獲得函數調用約定?
- 21. 如何使用__cdecl調用約定編譯boost?
- 22. API使用約定
- 23. 調試壞DLL調用約定錯誤
- 24. 確定何時調用使用jQuery
- 25. 使用nodejs時的JavaScript命名約定
- 26. 使用'this'和function.apply時接受約定
- 27. C++如何調用不支持的調用約定
- 28. C++自定義調用約定
- 29. 什麼是自定義調用約定?
- 30. 爲什麼使用錯誤的調用約定有時會起作用?