2017-02-20 2 views
0

Was bedeuten leere quadratische Klammern in einem C-Array eines benutzerdefinierten Typs?Wie funktionieren Unterobjekte in 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}, 
}; 

In dem obigen Code, was ist der Sinn des [BAR_1] = {1, 2}? Wann ist es möglich, eigenständige eckige Klammern zu verwenden?

Ich habe festgestellt, dass, wenn ich doppelte Werte in Klammern hinzufüge, clang eine Warnung über Subobjekt-Initialisierung gibt.

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}, 
       ^~~~~~~ 

Was ist ein C-Unterobjekt?

+0

Diejenigen, nur bestimmte Array-Elemente bezeichnen initialisiert werden. Die enum-Werte verhalten sich wie die entsprechenden 'int'-Werte, also wird' [BAR_1] = {1, 2} 'zu' [0] = {1, 2} ', was bedeutet, dass die erste Struktur im Array (Index 0) initialisiert wird mit 'is_interesting' als 1 und' alter' als 2. – Dmitri

+0

Für was ein Unterobjekt ist, siehe http://stackoverflow.com/questions/18451683/c-disambiguation-subobject-and-subclass-object – racraman

+0

"subobject" ist any Objekt in einem anderen Objekt enthalten. –

Antwort

2

Dies ist die Strukturinitialisierung, das "Subobjekt" ist die Instanz der Struktur, die initialisiert wird.

Ihre Warnung wird ausgegeben, wenn versucht wird, dieselbe Array-Position zweimal zu initialisieren.

siehe auch How to initialize a struct in accordance with C programming language standards

+2

Warnung, kein Fehler. Es ist gültig, es zweimal zu initialisieren. – 2501

+0

ja .. obwohl -Werror :) –

+0

Natürlich sollten Warnungen nicht ignoriert werden: -Wno-Initializer-Overrides. :-) – 2501

Verwandte Themen