Was bedeuten doppelte geschweifte Klammern, die eine C-Struktur initialisieren?

Was bedeuten doppelte geschweifte Klammern, die eine C-Struktur initialisieren?


Ich arbeite derzeit mit Legacy-C++ Code, erfolgreich kompiliert mit gcc 2.9.X.

Ich wurde gebeten, diesen Legacy-Code auf gcc 3.4.X zu portieren. Die meisten Fehler ließen sich leicht korrigieren, aber dieser spezielle verwundert mich.


Der Kontext:


 struct TMessage 
{
THeader header;
TData data;
};
struct THeader
{
TEnum myEnum;
TBool validity;
};

Was wurde gemacht:


 const TMessage init = {{0}};
/* Later in the code ... */
TMessage message = init;

Meine Frage(n) :

Was bedeutet der Operator {{}}? Initialisiert es das erste Feld (den Header ) zu einer binären 0 ? Initialisiert es das erste Feld der ersten Struktur (die enum ) zu (literal) 0 ?


Der 3.4.6-Fehler, den ich erhalte, ist invalid conversion from 'int' to 'TEnum' , entweder mit einem oder zwei Paar geschweiften Klammern.


Wie kann ich meine Struktur auf eine Reihe von Nullen setzen, ohne memset zu verwenden?


Danke im Voraus.


Antworten:


Es initialisiert alle Felder der POD-Struktur auf 0.


Begründung:


const SomeStruct init = {Value};

Initialisiert das erste Feld von SomeStruct auf Value, den Rest der Struktur auf Null (ich habe den Abschnitt im Standard vergessen, aber er steht irgendwo)


Also:


const SomeOtherStruct init = {{Value}};

Initialisiert das erste Feld des ersten Felds der Struktur (wobei das erste Feld der Struktur selbst eine POD-Struktur ist) auf Value, und den Rest des ersten Felds auf Null und den Rest der Struktur auf 0.


Außerdem funktioniert dies nur deshalb nicht, weil c++ die implizite Konvertierung von int verbietet um Typen aufzuzählen, also könnten Sie Folgendes tun:


const SomeOtherStruct init = {{TEnum(0)}};