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?
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
Für was ein Unterobjekt ist, siehe http://stackoverflow.com/questions/18451683/c-disambiguation-subobject-and-subclass-object – racraman
"subobject" ist any Objekt in einem anderen Objekt enthalten. –