这是这篇文章的副本: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 :(得分:3)
C99提供复合文字,将为您提供所需内容:
WaitForMultipleObjects( 3,
(HANDLE*){hThread1, hThread2, hThread3},
FALSE,
INFINITE );
不幸的是,微软已经表示他们没有兴趣支持C90以后的任何C标准,除了恰好是C ++一部分的那些功能(并且C ++没有复合文字)。
您可以编写一个可变函数来构建HANDLE
的数组并返回指向其第一个元素的指针。然后呼叫可能如下:
WaitForMultipleObjects( 3,
HandleList(3, hThread1, hThread2, hThread3),
FALSE,
INFINITE );
但是你有管理为数组分配的内存的常见问题。
C90没有提供一种特别干净的方式来做你想做的事。