2011-06-24 2 views
2

Je suis tombé sur ce que je pensais être une syntaxe unique que je n'avais jamais vue auparavant (je viens principalement d'un arrière-plan C++). Je ne suis pas sûr de ce que le code est ci-dessous. Je suppose que c'est une façon unique de définir une structure, mais si quelqu'un pouvait expliquer clairement ce qu'il fait ici, ce serait une aide précieuse!Syntaxe de structure statique unique dans C?

static Foo f = 
{ 

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

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

Je me suis heurté à cela il ya une semaine. C'est une extension GNU, je ne me souviens plus de ce qu'on appelle ... –

+2

Cette forme d'initialisation est uniquement disponible en C99, et éventuellement aussi en extension gcc pré C99. –

+0

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

Répondre

3

Il s'agit de la syntaxe d'initialisation C99.

Notez qu'une virgule finale est ok dans C99, et l'extrait aurait pu être écrit

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

virgule Note après .c[0] et .c[2].

2

La #ifdef est ancienne plaine conditionnelle compilation: il fait disparaître si BAR est défini les deux lignes de fond. Le .a = {DEFAULT_FOO} est la syntaxe d'initialisation C99, il fournit une valeur initiale pour le champ a de la structure. Le static, en C, rend la variable globale f invisible pour l'éditeur de liens, de sorte qu'elle ne sera pas disponible en dehors de l'unité de traduction actuelle ou ne se heurtera pas aux variables nommées similaires dans d'autres unités de traduction.

0

il est une initialisation struct marquée, décrit here

la ballants bizarre comma juste après la #ifdef est là juste pour se assurer qu'il ya une virgule entre les éléments, mais pas à la fin wether la dernière partie est active ou non.