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 );

残念ながら、Microsoft は、たまたま C++ の一部である機能 (および C++ には複合リテラルがありません) を除いて、C90 以降の C 標準をサポートすることに関心がないと述べています。

HANDLEs の配列を構築し、その最初の要素へのポインターを返す可変引数関数を作成できます。呼び出しは次のようになります。

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

ただし、配列に割り当てられたメモリを管理するという通常の問題があります。

C90 は、あなたが望むことを行う特にクリーンな方法を提供しません。

于 2012-06-29T20:20:49.263 に答える