2011-06-24 7 views
2

私はこれまで一度も見たことのないユニークな構文だと思った(私はたいていC++のバックグラウンドに由来する)。私はコードが下に何であるか分からない。私の推測では、それは構造体を定義する独特の方法ですが、もし誰かがここで何をしているのかを明確に説明できるなら、大きな助けになるでしょう!Cの一意の静的構造構文

static Foo f = 
{ 

    .a = {DEFAULT_FOO}, 
    .b = DEFAULT_BAR, 
    .c[0] = { 0 } 

#ifdef BAR 
    , 
    .c[1] = { 0 }, 
    .c[2] = { 0 } 
#endif 
}; 
+0

私はちょうど1週間前のようにこれに遭遇しました。これはGNUの拡張であり、私はそれが何であるか覚えていません... –

+2

この初期化形式はC99でのみ利用可能で、おそらくはg99拡張子pre99としても使用できます。 –

+0

http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Designated-Inits.html#Designated-Inits –

答えて

3

これはC99初期化構文です。最後のコンマはC99でokです、とスニペットは.c[0].c[2]

static Foo f = 
{ 
    .a = {DEFAULT_FOO}, 
    .b = DEFAULT_BAR, 
    .c[0] = { 0 }, 
#ifdef BAR 
    .c[1] = { 0 }, 
    .c[2] = { 0 }, 
#endif 
}; 

ノートコンマを書かれている可能性が

注意。

2

#ifdefは昔ながらの条件付きコンパイルである:それはBARが定義されていれば下の2行が消えます。

.a = {DEFAULT_FOO}は、C99初期化構文であり、構造体のフィールドaの初期値を提供します。

staticは、Cでグローバル変数fをリンカーに見えないようにするため、現在の翻訳単位の外部では使用できないか、他の翻訳単位の類似の名前の変数と衝突しません。

0

それがラベルされた構造体の初期化だ、変なダングリングだけで#ifdef後ちょうど最後の部分がアクティブかそうでない天気を要素が、どれもの間にカンマが終わりがあることを確認することがありコンマhere

を説明しました。