2012-06-29 80 views
3

這是這篇文章的副本:Brace Enclosed Initializer List As Function Argument,雖然我正在尋找一種解決方案,只使用C中可用的方法。我正在使用Windows 8編譯器。如何將大括號初始化列表作爲參數傳遞?

基本上,我希望做這樣的事情:

HANDLE hThread1 = CreateThread(...); 
HANDLE hThread2 = CreateThread(...); 
HANDLE hThread3 = CreateThread(...); 

... 

WaitForMultipleObjects(3, {hThread1,hThread2,hThread3}, FALSE, INFINITE); 

,而不是這樣的:

HANDLE hThread[3]; 
hThread[0] = CreateThread(...); 
hThread[1] = CreateThread(...); 
hThread[2] = CreateThread(...); 

... 

WaitForMultipleObjects(3, hThread, FALSE, INFINITE); 



foo(arg1, arg2, {arg3_1, arg3_2}); 
+0

我誤解了你的問題。你想在C中使用'std :: foo',它是C++嗎? – thb

+0

這是原始問題的副本。我只想使用像這樣的參數:'randomFunction(arg1,args,{arg3_1,arg3_2});' – wanovak

回答

2

C99提供了複合文字,這給你想要的東西:

WaitForMultipleObjects(3, 
         (HANDLE*){hThread1, hThread2, hThread3}, 
         FALSE, 
         INFINITE); 

不幸的是,Micros經常表示他們沒有興趣支持任何C標準,除了那些碰巧是C++一部分的特性(並且C++沒有複合文字)。

您可以編寫一個可變參數函數,它構建一個數組HANDLE s並返回一個指向其第一個元素的指針。然後通話可能看起來像:

WaitForMultipleObjects(3, 
         HandleList(3, hThread1, hThread2, hThread3), 
         FALSE, 
         INFINITE); 

但是,那麼你有管理分配給陣列的內存通常的問題。

C90不提供一個乾淨的方式來做你想做的事。

+2

有多少處理等待函數可以使用的限制(32?64?),所以他可以分配max在堆棧上,而不用擔心內存管理。 (可能會稍微慢一些,但是無論如何。) – Mehrdad

相關問題