21

github https://github.com/umlaeute/v4l2loopback/blob/master/v4l2loopback.cでいくつかのコードを調べていたところ、この行に出くわしました。これは私が知らない信じられないほどクールなカーネルマクロまたはgcc機能ですか?何をし= -1ますか?

static int video_nr[MAX_DEVICES] = { [0 ... (MAX_DEVICES-1)] = -1 };
module_param_array(video_nr, int, NULL, 0444);
MODULE_PARM_DESC(video_nr, "video device numbers (-1=auto, 0=/dev/video0, etc.)");

問題の行は最初の行で、次の2つはコンテキストに指定されています(これは、カーネルマクロhttp://lxr.free-electrons.com/source/include/linux/moduleparam.h#L103を使用してcmdline指定可能なパラメーターを作成しています。)。

とにかく、配列の初期化はどうなっているのでしょうか。その構文はどのように機能しますか?

4

1 に答える 1

24

指定された初期化子の例を見つけました。C99とC11は、あなたの例ほどではありませんが、この種の動作をかなり柔軟にサポートしています。(を使用した)特定の例...はGCC拡張です。リンクから:

要素の範囲を同じ値に初期化するには、を書き込み[first ... last] = valueます。これはGNU拡張機能です。例えば、

int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

つまり、この例では、サイズの配列を作成し、MAX_DEVICESその配列内のすべての要素をに初期化してい-1ます。

参考までに、標準でサポートされている唯一の動作は、範囲ではなく特定のインデックスを割り当てることです。

[定数式]=初期化値

仕様の私のコピーには、より複雑な例があります。

int a[MAX] = {
            1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
};

これにより、配列の最初の5つの要素と最後の5つの要素が明示的な値に初期化されます。中央の値(存在する場合)は0

于 2013-01-24T23:59:46.840 に答える