2017-02-20 3 views
0

Quelle est la signification des crochets autonomes à l'intérieur d'un tableau C d'un type personnalisé?Comment les sous-objets fonctionnent dans C?

typedef enum { 
    BAR_1 = 0, 
    BAR_2, 
    BAR_3, 
} bar_types; 

typedef struct { 
    int is_interesting; 
    int age; 
} foo_s; 

static foo_s bars[] = { 
    [BAR_1] = {1, 2}, /* What is being done here? */ 
    [BAR_2] = {1, 41}, 
    [BAR_3] = {0, 33}, 
}; 

Dans le code ci-dessus, quel est le sens de [BAR_1] = {1, 2}? Quand est-il possible d'utiliser des crochets autonomes?

J'ai remarqué que si j'ajoute une valeur en double entre parenthèses, clang donne un avertissement à propos de l'initialisation du sous-objet.

static foo_s bars[] = { 
    [BAR_1] = {1, 2}, 
    [BAR_2] = {1, 41}, 
    [BAR_3] = {0, 33}, 
    [BAR_3] = {0, 33}, 
}; 

----- 

$clang example.c 
example.c:17:19: warning: subobject initialization 
    overrides initialization of other fields within its 
    enclosing subobject [-Winitializer-overrides] 
    [BAR_3] = {0, 33}, 
       ^~~~~~~ 

Qu'est-ce qu'un sous-objet C?

+0

ceux qui viennent désigner les éléments du tableau spécifiques à initialisées. Les valeurs enum agissent comme les valeurs 'int' correspondantes, donc' [BAR_1] = {1, 2} 'devient' [0] = {1, 2} ', ce qui signifie que la première structure du tableau (index 0) est initialisée avec 'is_interesting' comme 1 et' age' comme 2. – Dmitri

+0

Pour ce qu'est un sous-objet, voir http://stackoverflow.com/questions/18451683/c-disambiguation-subobject-and-subclass-object – racraman

+0

"subobject" est un objet contenu dans un autre objet. –

Répondre

2

Ceci est l'initialisation de la structure, le "sous-objet" est l'instance de la structure qui est initialisée. Votre avertissement vient d'essayer d'initialiser deux fois la même position de tableau.

voir aussi How to initialize a struct in accordance with C programming language standards

+2

Attention, pas d'erreur. Il est valide de l'initialiser deux fois. – 2501

+0

oui .. bien que -Werror :) –

+0

Bien sûr, les avertissements ne doivent pas être ignorés: -Wno-initializer-overrides. :-) – 2501