C C 函式呼叫方式內幕

2021-04-21 05:59:14 字數 1894 閱讀 6032

注意:1、_beginthread需要__cdecl的執行緒函式位址,_beginthreadex和createthread需要__stdcall的執行緒函式位址。

2、一般win32的函式都是__stdcall。而且在windef.h中有如下的定義:

#define callback __stdcall

#define winapi  __stdcall

3、extern "c" _declspec(dllexport) int __cdecl add(int a, int b);

typedef int (__cdecl*funpointer)(int a, int b);

修飾符的書寫順序如上。

4、 extern "c"的作用:如果add(int a, int b)是在c語言編譯器編譯,而在c++檔案使用,則需要在c++檔案中宣告:extern "c" add(int a, int b),因為c編譯器和c++編譯器對函式名的解釋不一樣(c++編譯器解釋函式名的時候要考慮函式引數,這樣是了方便函式過載,而在c語言中不存在函式過載的問題),使用extern "c",實質就是告訴c++編譯器,該函式是c庫裡面的函式。如果不使用extern "c"則會出現鏈結錯誤。

一般象如下使用:

#ifdef _cplusplus

#define extern_c extern "c"

#else

#define extern_c extern

#endif

#ifdef _cplusplus

extern "c"

#endif

5、mfc提供了一些巨集,可以使用afx_ext_class來代替__declspec(dllexport),並修飾類名,從而匯出類,afx_api_export來修飾函式,afx_data_export來修飾變數

afx_class_import:__declspec(dllexport)

afx_api_import:__declspec(dllexport)

afx_data_import:__declspec(dllexport)

afx_class_export:__declspec(dllexport)

afx_api_export:__declspec(dllexport)

afx_data_export:__declspec(dllexport)

afx_ext_class:#ifdef _afxext

afx_class_export

#else

afx_class_import

6、 dllmain負責初始化(initialization)和結束(termination)工作,每當乙個新的程序或者該程序的新的執行緒訪問dll時,或者訪問dll的每乙個程序或者執行緒不再使用dll或者結束時,都會呼叫dllmain。但是,使用terminateprocess或 terminatethread結束程序或者執行緒,不會呼叫dllmain。

7、乙個dll在記憶體中只有乙個例項

dll程式和呼叫其輸出函式的程式的關係:

1)、dll與程序、執行緒之間的關係

dll模組被對映到呼叫它的程序的虛擬位址空間。

dll使用的記憶體從呼叫程序的虛擬位址空間分配,只能被該程序的執行緒所訪問。

dll的控制代碼可以被呼叫程序使用;呼叫程序的控制代碼可以被dll使用。

dlldll可以有自己的資料段,但沒有自己的堆疊,使用呼叫程序的棧,與呼叫它的應用程式相同的堆疊模式。

2)、關於共享資料段

dll 定義的全域性變數可以被呼叫程序訪問;dll可以訪問呼叫程序的全域性資料。使用同一dll的每乙個程序都有自己的dll全域性變數例項。如果多個執行緒併發訪問同一變數,則需要使用同步機制;對乙個dll的變數,如果希望每個使用dll的執行緒都有自己的值,則應該使用執行緒區域性儲存(tls,thread local strorage)。

C C 函式呼叫方式

cdecl 是c declaration的縮寫 declaration,宣告 表示c語言預設的函式呼叫方法 所有引數從右到左依次入棧,這些引數由呼叫者清除,稱為手動清棧。被呼叫函式不會要求呼叫者傳遞多少引數,呼叫者傳遞過多或者過少的引數,甚至完全不同的引數都不會產生編譯階段的錯誤。stdcall 是...

C C 函式呼叫方式

呼叫約定 cdecl fastcall與 stdcall,三者都是呼叫約定 calling convention 它決定以下內容 1 函式引數的壓棧順序,2 由呼叫者還是被呼叫者把引數彈出棧,3 以及產生函式修飾名的方法。1 stdcall呼叫約定 函式的引數自右向左通過棧傳遞,被呼叫的函式在返回前...

C C 函式呼叫方式

cdecl fastcall與 stdcall,三者都是呼叫約定 calling convention 它決定以下內容 1 函式引數的壓棧順序,2 由呼叫者還是被呼叫者把引數彈出棧,3 以及產生函式修飾名的方法。1 stdcall呼叫約定 函式的引數自右向左通過棧傳遞,被呼叫的函式在返回前清理傳送引...