如何将大括号括起初始化列表作为参数传递?

时间:2012-06-29 20:07:58

标签: c function

这是这篇文章的副本: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});

1 个答案:

答案 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没有提供一种特别干净的方式来做你想做的事。