Der schnellste Weg, um ein Array von Strukturen auf Nullen zu initialisieren?

Lesezeit: 4 Minuten

Benutzer-Avatar
TCSGrad

Ich versuche, ein Array von Strukturen mit allen Nullen zu initialisieren, indem ich die folgende Syntax verwende:

STRUCTA array[MAX] = {0};

Ich erhalte jedoch die folgende Warnung von gcc :

Warnung: fehlende Klammern um den Initialisierer

Was mache ich falsch – gibt es einen anderen/besseren Weg, dies zu tun?

  • Hilft Ihnen das? stackoverflow.com/questions/201101/… (siehe zweite Antwort)

    – rlb.usa

    25. März 2011 um 15:54 Uhr

  • @RedX – STRUCTA ist ein zufälliges Beispiel … jede Struktur wirft dies – ich kann die genaue Struktur nicht preisgeben, da es sich um einen Firmencode handelt 🙂

    – TCSGrad

    25. März 2011 um 16:02 Uhr

Benutzer-Avatar
AnT steht zu Russland

Wenn das erste Mitglied Ihrer Struktur einen Skalartyp hat, verwenden Sie

STRUCTA array[MAX] = {{ 0 }};

Wenn das erste Mitglied Ihrer Struktur zufällig ein anderes Strukturobjekt ist, dessen erstes Mitglied einen skalaren Typ hat, müssen Sie verwenden

STRUCTA array[MAX] = {{{ 0 }}};

usw. Grundsätzlich müssen Sie eine neue Ebene der Verschachtelung öffnen {} Jedes Mal, wenn Sie ein anderes verschachteltes Aggregat (eine Struktur oder ein Array) “betreten”. Also in diesem Fall solange die Erste Das Mitglied jedes verschachtelten Aggregats ist auch ein Aggregat, mit dem Sie tiefer gehen müssen {}.

All diese zusätzlichen geschweiften Klammern sind nur da, um die Warnung zu vermeiden. Natürlich ist dies (in diesem speziellen Fall) nur eine harmlose Warnung. Sie können eine einfache verwenden { 0 } und es wird funktionieren.

Der wahrscheinlich beste Weg, damit umzugehen, besteht darin, diese Warnung vollständig zu deaktivieren (siehe Antwort von @ pmg für die richtige Befehlszeilenoption). Jemand, der an GCC arbeitete, dachte nicht klar. Ich meine, ich verstehe den Wert dieser Warnung (und sie kann in der Tat sehr nützlich sein), aber sie bricht die Funktionalität von { 0 } ist nicht akzeptabel. { 0 } hätte eine Sonderbehandlung erhalten müssen.

  • Die Warnung kann nicht deaktiviert werden … Unternehmensrichtlinie, und ich muss sagen, dass dies zu einem saubereren Code führt !!

    – TCSGrad

    25. März 2011 um 16:03 Uhr

  • @ shan23: Ich würde sagen, dass der sauberste Code ist { 0 }der universelle Nullinitialisierer in C. Ihre Firmenrichtlinie zerstört eine der saubersten Idiome der C-Sprache (und eine sehr nützliche).

    – AnT steht zu Russland

    25. März 2011 um 16:05 Uhr


  • +1 Ich stimme größtenteils zu, ich würde sagen, dass das Problem nicht die Unternehmensrichtlinie, sondern die gcc-Richtlinie ist. -Wno-braces tatsächlich deaktiviert auch andere potenziell nützlich Klammerbezogene Warnungen (wie if if else Sachen), und gcc ist einfach falsch und dumm, den universellen Zero-Initialisierer in dieser Hinsicht nicht als besonders zu betrachten.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    25. März 2011 um 18:50 Uhr

gcc ist ein Ärgernis. Das sollte sie ohne Vorwarnung hinnehmen.
Versuche dies

STRUCTA array[MAX] = {{0}};

Dieses gcc-Verhalten kann mit der Option gesteuert werden -Wmissing-braces oder -Wno-missing-braces.

-Wall aktiviert diese Warnung; haben -Wall aber nicht die fehlenden geschweiften Klammern verwenden -Wall -Wno-missing-braces

Dies ist lediglich eine schädliche Warnung, die von gcc ausgegeben wird, und ich würde sie damit deaktivieren -Wno-braces. {0} ist ein äußerst nützlicher “universeller Null-Initialisierer” für Typen, deren Definition Ihr Code nicht kennen sollte, und das Abraten von gcc von seiner Verwendung ist aktiv schädlich für das Streben nach gutem Code.

Wenn gcc diese Warnung beibehalten möchte, sollte dies zumindest ein Sonderfall sein {0} und deaktivieren Sie die Warnung in diesem einen Fall.

Sie können die Warnung umgehen, indem Sie vollständig leere Klammern verwenden:

STRUCTA-Array[10] = {};

Das Array wird sein Aggregat initialisiertwas bedeutet, dass jede der darin enthaltenen Strukturen wiederum sein wird Wert-initialisiert. Wert-Initialisierung mit leeren Klammern wird zu Aggregat-Initialisierung jeder Struktur, die alle Felder auf 0 setzt, was Sie wollen.

Dies funktioniert in allen Fällen, solange Ihre Strukturen POD sind (siehe die obigen Links für eine genaue Beschreibung).

Arrays werden mit geschweiften Klammern initialisiert, aber das gilt auch für Strukturen. Sie müssen wahrscheinlich einen zusätzlichen Satz geschweifter Klammern um Ihre 0 und setzen, je nachdem wie STRUCTA definiert ist, einige zusätzliche Nullen durch Kommas getrennt.

Benutzer-Avatar
Rumple Stiltskin

Das hängt von der STRUCTA ab. Zum Beispiel :

typedef struct structa 
{
    int a, b;
} STRUCTA;

int main (int argc, char const* argv[])
{
    STRUCTA array[10] = {{0,0}};
    return 0;
}

Benutzer-Avatar
Tamarintech

Kann STRUCTA 0 zugewiesen werden?

Sie können auch immer memset() verwenden.

  • Siehe das Beispiel von Rumple Stiltskin oben. Das habe ich versucht zu kommunizieren. Wenn STRUCTA {0} nicht direkt zugewiesen werden kann, lässt gcc dies nicht zu. memset wird es jedoch blind tun.

    – Tamarintech

    25. März 2011 um 16:06 Uhr


  • Erstens ist es keine Zuweisung, es ist eine Initialisierung. Zweitens, irgendein struct (oder array) in der C-Sprache kann mit initialisiert werden { 0 }.

    – AnT steht zu Russland

    25. März 2011 um 16:09 Uhr

  • … so etwas wie mystruct x { int a; int b; } kann auf {0} initialisiert werden? Ich dachte, du bräuchtest mindestens {{0, 0}}

    – Tamarintech

    25. März 2011 um 16:21 Uhr

  • @AndreyT: Nicht nur Strukturen und Arrays. Jeder Typ in C kann mit initialisiert werden {0}. int x = {0}; ist gültig C.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    25. März 2011 um 17:58 Uhr


1374330cookie-checkDer schnellste Weg, um ein Array von Strukturen auf Nullen zu initialisieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy