[問題] __stdcall __cdecl

看板C_and_CPP作者 (哈里歐)時間15年前 (2010/02/18 03:21), 編輯推噓3(305)
留言8則, 4人參與, 最新討論串1/3 (看更多)
我要跑多執行緒 要有__stdcall的call convention: unsigned __stdcall Foo(void* lp) { int *pInt = (int*)lp; printf("%d\n", *pInt); return 0; } 這樣主程式才能使用: int main(int argc, wchar_t* argv[]) { HANDLE hThread; unsigned threadID; int* pInt = new int(10); hThread = (HANDLE)_beginthreadex(NULL, 0, Foo, pInt, 0, &threadID); printf("thread 1: %d\n", (const char*)hThread); hThread = (HANDLE)_beginthreadex(NULL, 0, Foo, pInt, 0, &threadID); printf("thread 2: %d\n", (const char*)hThread); getchar(); delete pInt; return 0; } 我有兩個問題: 1. 是因為_beginthreadex參數有__stdcall 所以callee要加call convention 還是因為是呼叫OS的API所以才要加call convention呢? 2. 我查資料後 文件是說__cdecl是C和C++程式的預設呼叫方式 那一般我們在宣告函式的時候 都不寫call convention是因為他預設是__cdecl呼叫 還是其他原因呢?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.6.181

02/18 13:09, , 1F
2.是因為 "我們需要用 __stdcall" 才特別加上去的吧?
02/18 13:09, 1F

02/18 13:10, , 2F
因為 Windows 下幾乎都是以 __stdcall 為標準 ?
02/18 13:10, 2F

02/18 13:51, , 3F
預設call convention不是compiler可以設嗎?? 小弟我記得
02/18 13:51, 3F

02/18 13:51, , 4F
VC裡就有一個地方在設這個@_@"
02/18 13:51, 4F

02/18 15:20, , 5F
不推薦在 compiler 上面設定, 會引發更多問題
02/18 15:20, 5F

02/18 15:44, , 6F
1.正確說來是 _beginthreadex 裡在呼叫你的 callback 函式時
02/18 15:44, 6F

02/18 15:45, , 7F
(以你這裡就是你的 Foo) 它預設那個函式是 __stdcall
02/18 15:45, 7F

02/18 15:45, , 8F
講預設好像不太對 它期待那個函式是 __stdcall
02/18 15:45, 8F
文章代碼(AID): #1BVB94mR (C_and_CPP)
討論串 (同標題文章)
以下文章回應了本文
完整討論串 (本文為第 1 之 3 篇):
問題
3
8
文章代碼(AID): #1BVB94mR (C_and_CPP)