6

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

1 回答 1

4

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

WaitForMultipleObjects( 3,
                        (HANDLE*){hThread1, hThread2, hThread3},
                        FALSE,
                        INFINITE );

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

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

WaitForMultipleObjects( 3,
                        HandleList(3, hThread1, hThread2, hThread3),
                        FALSE,
                        INFINITE );

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

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

于 2012-06-29T20:20:49.263 回答