这是这篇文章的副本: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});
最佳答案
C99 提供复合文字,会给你你想要的:
WaitForMultipleObjects( 3,
(HANDLE*){hThread1, hThread2, hThread3},
FALSE,
INFINITE );
不幸的是,Microsoft 表示他们没有兴趣支持 C90 之后的任何 C 标准,除了那些恰好是 C++ 一部分的功能(并且 C++ 没有复合文字)。
您可以编写一个可变参数函数来构建一个 HANDLE
数组并返回指向其第一个元素的指针。调用可能如下所示:
WaitForMultipleObjects( 3,
HandleList(3, hThread1, hThread2, hThread3),
FALSE,
INFINITE );
但是随后您会遇到管理分配给数组的内存的常见问题。
C90 没有提供一种特别干净的方式来做你想做的事。
关于c - 如何将大括号括起来的初始化列表作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11268305/