從寫執行緒函式時遇到的 stdcall談起

2021-05-18 05:35:50 字數 974 閱讀 1020

今天寫執行緒函式時,發現msdn中對threadproc的定義有要求: dword winapi threadproc( lpvoid lpparameter);

不解為什麼要用winapi巨集定義,查了後發現下面的定義。

於是乎需要區別 __stdcall和__cdecl兩者的區別:

#define callback __stdcall

#define winapi __stdcall

#define winapiv __cdecl

#define apientry winapi

#define apiprivate __stdcall

#define pascal __stdcall

#define cdecl _cdecl

#ifndef cdecl

#define cdecl _cdecl

#endif

幾乎我們寫的每乙個windows api函式都是__stdcall型別的

首先,需要了解兩者之間的區別:

windows的函式呼叫時需要用到棧(stack,一種先入後出的儲存結構)。當函式呼叫完成後,棧需要清理,這裡就是問題的關鍵,如何清理???

如果我們的函式使用了_cdecl,那麼棧的清除工作是由呼叫者,用com的術語來講就是客戶來完成的。這樣帶來了乙個棘手的問題,不同的編譯器產生棧的方式不盡相同,那麼呼叫者能否正常的完成清理工作呢?答案是不能。

如果使用__stdcall,上面的問題就解決了,函式自己解決清理工作。所以,在跨(開發)平台的呼叫中,我們都使用__stdcall(雖然有時是以winapi的樣子出現)。

那麼為什麼還需要_cdecl呢?

當我們遇到這樣的函式如fprintf()它的引數是可變的,不定長的,被呼叫者事先無法知道引數的長度,事後的清除工作也無法正常的進行,因此,這種情況我們只能使用_cdecl。

到這裡我們有乙個結論:如果你的程式中沒有涉及可變引數,最好使用__stdcall關鍵字。

多執行緒程式寫日誌時遇到加鎖的問題

前段時間在做專案時,系統是個多執行緒程式,幾個執行緒都需要寫日誌,主線程和通訊線程經常在寫日誌時打架,為了解決這個問題,考慮在寫日誌的方法中加鎖。如下 寫日誌時加鎖 private static object m lock new object 寫日誌檔案的介面函式,此函式只向指定的檔案寫入字串 i...

寫HTML CSS頁面時遇到的坑

html和css這前端簡直是一大坑 按著教程來一點點實踐看不下去了,就打算自己做著乙個頁面先。其中又想把vim的補全弄好,還有git學會,想著存上github,但都太麻煩了tat 跑題了跑題了,git和vim的ycm補全都沒弄好,但html和css的坑倒是踩了不少。我還以為在寫width和heigh...

近期寫題遇到的函式

1.ceil函式 用法 double ceil double x 功能 返回大於或者等於指定表示式的最小整數 標頭檔案 cmath math.h 2.stol函式 用法 long stol const string str,size t idx 0,int base 10 str 要轉換的字串行。i...