__cdecl和__stdcall都是函數(shù)調(diào)用規(guī)范(還有一個__fastcall),規(guī)定了參數(shù)出入棧的順序和方法,如果只用VC編程的話可以不用關(guān)心,但是要在C++和Pascal等其他語言通信的時候就要注意了,只有用相同的方法才能夠調(diào)用成功.另外,像printf這樣接受可變個數(shù)參數(shù)的函數(shù)只有用cdecl才能夠?qū)崿F(xiàn).
__declspec主要是用于說明DLL的引出函數(shù)的,在某些情況下用__declspec(dllexport)在DLL中生命引出函數(shù),比用傳統(tǒng)的DEF文件方便一些.在普通程序中也可以用__declspec(dllimport)說明函數(shù)是位于另一個DLL中的導(dǎo)出函數(shù).
int WINAPI MessageBoxA(HWND,LPCSTR,LPSTR,UINT);
而WINAPI實(shí)際上就是__stdcall.
大多數(shù)API都采用__stdcall調(diào)用規(guī)范,這是因?yàn)閹缀跛械恼Z言都支持__stdcall調(diào)用.相比之下,__cdecl只有在C語言中才能用.但是__cdecl調(diào)用有一個特點(diǎn),就是能夠?qū)崿F(xiàn)可變參數(shù)的函數(shù)調(diào)用,比如printf,這用__stdcall調(diào)用是不可能的.
__fastcall這種調(diào)用規(guī)范比較少見,但是在Borland C++ Builder中比較多的采用了這種調(diào)用方式.
如果有共享代碼的需要,比如寫DLL,推薦的方法是用__stdcall調(diào)用,因?yàn)檫@樣適用范圍最廣.如果是C++語言寫的代碼供Delphi這樣的語言調(diào)用就必須聲明為__stdcall,因?yàn)镻ascal不支持cdecl調(diào)用(或許Delphi的最新版本能夠支持也說不定,這個我不太清楚).在其他一些地方,比如寫COM組件,幾乎都用的是stdcall調(diào)用.在VC或Delphi或C++Builder里面都可以從項(xiàng)目設(shè)置中更改默認(rèn)的函數(shù)調(diào)用規(guī)范,當(dāng)然你也可以在函數(shù)聲明的時候加入__stdcall,__cdecl,__fastcall關(guān)鍵字來明確的指示本函數(shù)用哪種調(diào)用規(guī)范.
__declspec一般都是用來聲明DLL中的導(dǎo)出函數(shù).這個關(guān)鍵字也有一些其他的用法,不過非常罕見.

文章來源:
http://www.shnenglu.com/dingding/archive/2008/10/21/64627.html