c/c++函式呼叫約定
關於c/c++ 函式呼叫約定,大多數時候並不會影響程式邏輯,但遇到跨語言程式設計時,了解一下還是有好處的。
vc 中預設呼叫是__cdecl 方式,windows api 使用__stdcall 呼叫方式,在dll 匯出函式中,為了跟windows api 保持一致,建議使用__stdcall 方式。
呼叫約定跟堆疊清除密切相關。如果寫乙個彙編函式,給c/c++ 呼叫,在__cdecl 方式下,則彙編函式無需清除堆疊,在__stdcall 方式下,彙編函式需要在返回(ret)之前恢復堆疊。
c 語言有__cdecl、__stdcall、__fastcall、naked、__pascal。
c++
語言有__cdecl、__stdcall、__fastcall、naked、__pascal、__thiscall,比c 語言多出一種__thiscall 呼叫方式。
在vc中,可以設定預設的呼叫約定,設定路徑為:
project
àproperties
àconfiguration properties
àc/c++
àadvanced
àcall conversion
。下面詳細介紹如上六種呼叫方式:
1、__cdecl
__cdecl
呼叫約定又稱為c 呼叫約定,是c/c++ 語言預設的呼叫約定。引數按照從右至左的方式入棧,函式本身不清理棧,此工作由呼叫者負責,返回值在eax中。由於由呼叫者清理棧,所以允許可變引數函式存在,如int sprintf(char* buffer,const char* format,...);。
2、__stdcall
__stdcall
很多時候被稱為pascal 呼叫約定。pascal 語言是早期很常見的一種教學用計算機程式語言,其語法嚴謹。引數按照從右至左的方式入棧,函式自身清理堆疊,返回值在eax中。
3、__fastcall
顧名思義,__fastcall 的特點就是快,因為它通過cpu 暫存器來傳遞引數。他用ecx 和edx 傳送前兩個雙字(dword)或更小的引數,剩下的引數按照從右至左的方式入棧,函式自身清理堆疊,返回值在eax 中。
4、naked
naked
是乙個很少見的呼叫約定,一般不建議使用。編譯器不會給這種函式增加初始化和清理**,更特殊的是,你不能用return返回返回值,只能用插入彙編返回結果,此呼叫約定必須跟__declspec 同時使用。例如定義乙個求和程式,如__declspec(naked) intadd(int a,int b);。
5、__pascal
這是pascal 語言的呼叫約定,跟__stdcall 一樣,引數按照從右至左的方式入棧,函式自身清理堆疊,返回值在eax中。vc 中已經廢棄了這種呼叫方式,因此在寫vc 程式時,建議使用__stdcall 代替。
6、__thiscall
這是c++ 語言特有的一種呼叫方式,用於類成員函式的呼叫約定。如果引數確定,this 指標存放於ecx 暫存器,函式自身清理堆疊;如果引數不確定,this指標在所有引數入棧後再入棧,呼叫者清理棧。__thiscall 不是關鍵字,程式設計師不能使用。引數按照從右至左的方式入棧。
C C 函式呼叫約定
關於 c c 函式呼叫約定,大多數時候並不會影響程式邏輯,但遇到跨語言程式設計時,了解一下還是有好處的。vc 中預設呼叫是 cdecl 方式,windows api 使用 stdcall 呼叫方式,在 dll 匯出函式中,為了跟 windows api 保持一致,建議使用 stdcall 方式。呼叫...
C C 函式呼叫約定
函式呼叫約定常見的函式呼叫約定 5 cdecl,stdcall,fastcall,thiscall,naked call mfc呼叫約定 vs6 project settings c c calling convention 1.cdecl c呼叫約定.the c default calling c...
C C 呼叫約定
c c 函式呼叫約定 在程式設計中,乙個函式完整的執行需要經過編譯鏈結等多個過程,而在每個過程中編譯器都需要為程式提供不同的服務,那麼乙個函式的呼叫執行到底需要幾個過程呢?下面我們先通過乙個函式棧幀的建立看看。define crt secure no warnings 1 include inclu...