2014-11-05 17 views
3

我一直在尋找像這裏提到的一些代碼:Function pointers for winapi functions (stdcall/cdecl)Function pointer and calling convention爲什麼要用__stdcall的函數指針

有什麼需要,利益宣告一個函數指針作爲__stdcall的呼叫類型?

爲什麼要聲明函數指針的調用類型?

+2

如果您不能使用函數指針調用函數,函數指針並不是非常有用。如果編譯器不知道函數期望的ABI,它就不能調用該函數。 – 2014-11-05 20:29:00

+0

好吧,創建一個聲明一個函數爲__cdecl的程序,並將函數的指針聲明爲__stdcall。給這個函數一些參數(也許和'int'和一個'double')。創建一個函數指針並調用該函數。當您的程序在通話中不斷崩潰時回到SO。 – PaulMcKenzie 2014-11-05 20:41:51

+1

另請參見:[當您調用約定不匹配時會出現什麼問題?](http://blogs.msdn.com/b/oldnewthing/archive/2004/01/15/58973.aspx) – 2014-11-06 03:51:31

回答

3

在函數指針中嵌入調用約定說明符允許您在通過該指針調用函數時使用該調用約定。 __stdcall是用於調用Win32 API函數的調用約定。

在函數指針中指定它的好處是能夠根據您的代碼的需要(例如通過late binding加載外部庫函數時)匹配不同的調用約定。庫標題應該將它們指定爲一種很好的編程習慣。

但有一點需要注意:如果在函數指針中嵌入了錯誤的調用約定,編譯器可能無力幫助您檢測該約定,並且最終可能會在運行時執行錯誤的事情。

相關問題