2012-06-29 45 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

相关问题