如何将括号括起来的初始化程序列表作为参数传递?

wan*_*vak 5 c function

这是此文章的副本:将括号括起来的初始化器列表作为函数参数,尽管我正在寻找仅使用C语言中可用方法的解决方案。我正在使用Windows 8编译器。

基本上,我想做这样的事情:

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

...

WaitForMultipleObjects( 3, {hThread1,hThread2,hThread3}, FALSE, INFINITE );
Run Code Online (Sandbox Code Playgroud)

代替这个:

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

...

WaitForMultipleObjects( 3, hThread, FALSE, INFINITE );



foo(arg1, arg2, {arg3_1, arg3_2});
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 4

C99 提供了复合文字,它会给你你想要的:

WaitForMultipleObjects( 3,
                        (HANDLE*){hThread1, hThread2, hThread3},
                        FALSE,
                        INFINITE );
Run Code Online (Sandbox Code Playgroud)

不幸的是,微软表示他们没有兴趣支持 C90 之后的任何 C 标准,除了那些恰好是 C++ 一部分的功能(并且 C++ 没有复合文字)。

您可以编写一个可变参数函数来构建 s 数组HANDLE并返回指向其第一个元素的指针。调用可能如下所示:

WaitForMultipleObjects( 3,
                        HandleList(3, hThread1, hThread2, hThread3),
                        FALSE,
                        INFINITE );
Run Code Online (Sandbox Code Playgroud)

但是,您会遇到管理为数组分配的内存的常见问题。

C90 没有提供一种特别干净的方式来做你想做的事情。

  • 等待函数可以接受的句柄数量是有限制的(32?64?),因此他可以在堆栈上分配最大值,而不必担心内存管理。(循环可能会稍微慢一些,但无论如何。) (2认同)