2012-03-29 12 views
6
55 typedef struct pidmap { 
56   atomic_t nr_free; 
57   void *page; 
58 } pidmap_t; 
59 
60 static pidmap_t pidmap_array[PIDMAP_ENTRIES] = 
61   { [ 0 ... PIDMAP_ENTRIES-1 ] = { ATOMIC_INIT(BITS_PER_PAGE), NULL } }; 

上記のコードスニペットは、Linuxカーネルソースで見つかった構造体の配列の初期化を示しています。以前はこのような初期化を見たことがなく、私自身も同じことをシミュレートできませんでした。私は実際に何が欠けていますか?Linuxカーネルソースで見つかった構造体配列のCの初期化メソッド

Source of the code

+3

なぜC++タグですか? LinuxカーネルはC++を使用しません。 – ThiefMaster

+0

拡張機能である必要があります。 – iammilind

+0

Linuxカーネルは、GCC固有の拡張機能をたくさん使用しています。例えば、 http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/index.html#toc_C-Extensions –

答えて

6

指定された初期化子と呼ばれるGNU/GCC拡張です。詳細についてはGCC documentationをご覧ください。

要素の範囲を同じ値に初期化するには、[first ... last] = valueと記述します。これはGNU拡張機能です

+2

精度のために、指定されたイニシャライザはGCC拡張ではありません([この質問を参照してください] ](http://stackoverflow.com/questions/9849719/what-do-square-brackets-mean-in-array-initialization-in-c))。ただし、範囲の構文は次のとおりです。 – huon

5

それは、Designated Initializerを使用して行われます。

gcc拡張であり、標準的な構造ではありません。それを使用すると移植性のないコードになります。移植性があなたの懸念事項の中で最も小さい場合を除き、このようなコンパイラ拡張を使用しないでください。

関連する問題