作者Smurf (哈里歐)
看板C_and_CPP
標題[問題] __stdcall __cdecl
時間Thu Feb 18 11:21:38 2010
我要跑多執行緒 要有__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
推 suhorng:2.是因為 "我們需要用 __stdcall" 才特別加上去的吧? 02/18 13:09
→ suhorng:因為 Windows 下幾乎都是以 __stdcall 為標準 ? 02/18 13:10
推 VictorTom:預設call convention不是compiler可以設嗎?? 小弟我記得 02/18 13:51
→ VictorTom:VC裡就有一個地方在設這個@_@" 02/18 13:51
推 wowtiger:不推薦在 compiler 上面設定, 會引發更多問題 02/18 15:20
→ LPH66:1.正確說來是 _beginthreadex 裡在呼叫你的 callback 函式時 02/18 15:44
→ LPH66: (以你這裡就是你的 Foo) 它預設那個函式是 __stdcall 02/18 15:45
→ LPH66: 講預設好像不太對 它期待那個函式是 __stdcall 02/18 15:45