呼叫約定 stdcall

2022-07-29 07:12:14 字數 729 閱讀 1966

__cdecl與__stdcall這兩種呼叫約定之間的主要差別在於由誰來執行對引數的清理工作。

如果是__cdecl,那麼主調函式將負責執行清理工作,如果是__stdcall那被調函式將負責執行清理。

通常,我們傾向於使用__stdcall,它能夠減少生成**的規模。因為不需要每次呼叫時,都在返回後對esp進行操作,比如add esp, 0ch.(抵消三個引數的大小)

__cdecl存在的意義是?支援變長數量的引數。

呼叫約定 引數傳遞 棧的清理工作 函式名修飾

stdcall  右到左  被調函式  函式名字前加"_",並且在後面增加'@'以及棧空間所需要的位元組數

cdecl  右到左  主調函式  在名字前加"_"

這種函式名的規範,在編譯後,比如缺少lib檔案時,會看到。

通常編譯器和聯結器將一起來確保根據呼叫約定呼叫正確的函式。但,有時聯結器不能提供這種機制,此時必須小心避免不匹配的情況。

windows api一般都會有winapi的字首,表示呼叫約定為__stdcall

#define winapi __stdcall

win32的api函式都遵循__stdcall呼叫約定。

在vc++開發環境中,預設的編譯選項是__cdecl(c呼叫約定),對於那些需要__stdcall呼叫約定的函式,在宣告時必須顯式地加上__stdcall。在windows程式中,**函式必須遵循__stdcall呼叫約定,所以我們在宣告**函式時要使用callback。

stdcall函式呼叫約定

被這個關鍵字修飾的函式,其引數都是從右向左通過堆疊傳遞的 fastcall 的前面部分由ecx,edx傳 函式呼叫在返回前要由被呼叫者清理堆疊。這個關鍵字主要見於microsoft visual c c gnu的c c 是另外一種修飾方式 attribute stdcall stdcall是函式呼叫...

stdcall函式呼叫約定詳解

對 stdcall 的理解 在c語言中,假設我們有這樣的乙個函式 int function int a,int b 呼叫時只要用result function 1,2 這樣的方式就可以使用這個函式。但是,當高階語言被編譯成計算機可以識別的機器碼時,有乙個問題就凸現出來 在cpu中,計算機沒有辦法知道...

約定stdcall 函式呼叫的三種約定,你都清楚嗎

cdecl stdcall fastcall是c c 裡中經常見到的三種函式呼叫方式。其中 cdecl是c c 預設的呼叫方式,stdcall是windows api函式的呼叫方式,只不過我們在標頭檔案裡檢視這些api的宣告的時候是用了winapi的巨集進行代替了,而這個巨集其實就是 stdcall...