呼叫規範stdcall和c語言的區別

2021-08-19 07:54:44 字數 778 閱讀 1764

在函式引數處理上不同

_stdcall是pascal程式的預設呼叫方式,引數採用從右到左的壓棧方式,被調函式自身在返回前清空堆疊。win32 api都採用_stdcall呼叫方式

_cdecl是c/c++的預設呼叫方式,引數採用從右到左的壓棧方式,傳送引數的記憶體棧由呼叫者維護。_cedcl約定的函式只能被c/c++呼叫,每乙個呼叫它的函式都包含清空堆疊的**,所以產生的可執行檔案大小會比呼叫_stdcall函式的大。

由於_cdecl呼叫方式的引數記憶體棧由呼叫者維護,所以變長引數的函式能(也只能)使用這種呼叫約定。

相應的**例項見網盤:

附:幾乎我們寫的每乙個windows api函式都是__stdcall型別的,為什麼??首先,我們談一下兩者之間的區別:windows的函式呼叫時需要用到棧(stack,一種先入後出的儲存結構)。當函式呼叫完成後,棧需要清除,這裡就是問題的關鍵,如何清除??如果我們的函式使用了_cdecl,那麼棧的清除工作是由呼叫者,用com的術語來講就是客戶來完成的。這樣帶來了乙個棘手的問題,不同的編譯器產生棧的方式不盡相同,那麼呼叫者能否正常的完成清除工作呢?答案是不能。如果使用__stdcall,上面的問題就解決了,函式自己解決清除工作。所以,在跨(開發)平台的呼叫中,我們都使用__stdcall(雖然有時是以winapi的樣子出現)。那麼為什麼還需要_cdecl呢?當我們遇到這樣的函式如fprintf()它的引數是可變的,不定長的,被呼叫者事先無法知道引數的長度,事後的清除工作也無法正常的進行,因此,這種情況我們只能使用_cdecl。到這裡我們有乙個結論,如果你的程式中沒有涉及可變引數,最好使用__stdcall 關鍵字

關於函式呼叫方式 stdcall和

關於函式呼叫方式 stdcall和 cdecl詳解 程式設計客棧stdcall cdecl 兩者的相同點與不同點 例項 stdcall stdcall的全稱是standard call。是c 的標準呼叫方式。函式引數的入棧順序為從右到左入棧。函式返回時使用retn x指令,其中x為調整堆疊的位元組數...

C 語言規範

類與結構有很多相似之處 結構可以實現介面,並且可以具有與類相同的成員型別。然而,結構在幾個重要方面不同於類 結構為值型別而不是引用型別,並且結構不支援繼承。結構的值儲存在 在堆疊上 或 內聯 細心的程式設計師有時可以通過聰明地使用結構來增強效能。例如,將 point 定義為結構而不是類在執行時可以節...

C 語言規範

c 語言規範的 1.2 和 2.0 版是關於 c 語法的權威資料。它們包含該語言各個方面的詳細資訊,包括 visual c 產品文件未涉及的許多語法點。1.2 規範討論了在 visual c 2005 推出之前為該語言新增的功能,而 2.0 規範則討論了針對 visual c 2005 新增的功能。...