GCC fehlt Klammern um Initialisierer [duplicate]

Lesezeit: 4 Minuten

Benutzer-Avatar
Fred Bassett

Ich habe diese Struktur in C unten, die ich auf Null initialisieren möchte. Wie entferne ich die Warnung wegen fehlender geschweifter Klammern?

typedef struct {
    uint32_t incoming[FRAME_TYPE_MAX];
    uint32_t outgoing[FRAME_TYPE_MAX];
    uint32_t timeouts;
    uint32_t crc_errors;
} pkt_t;

static pkt_t stats = {0};

  • Verwenden {0} als Initialisierer ist eine sehr nützliche Redewendung. Es gilt für irgendein Typ, und es initialisiert alle Mitglieder auf Null (0, 0,0 oder NULL). Schade, dass gcc das nicht erkennt.

    – Keith Thompson

    19. Juli 2012 um 0:08 Uhr

Dies ist der GCC-Fehler Nr. 53119:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119

Wenn Sie möchten, dass es behoben wird, posten Sie einen Follow-up zum Fehlerbericht und geben Sie an, dass es sich um ein Problem für Sie handelt.

  • Es scheint jedoch, dass man Struct-Mitglieder so umordnen kann, dass das erste zu einem Skalar wird und die Warnung verschwindet. Dies ist keine Option, wenn Sie z. B. speicherabgebildete Geräteregister neu interpretieren müssen, obwohl dies in den meisten Fällen als Problemumgehung angesehen werden kann.

    – Eldar Abusalimov

    15. Oktober 2013 um 15:37 Uhr


  • Das kann oder kann nicht möglich sein, aber es ist definitiv keine angemessene Lösung.

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

    16. Oktober 2013 um 3:28 Uhr

  • Es ist keine Lösung. Es ist ein zeitliche Problemumgehung bis der GCC-Fehler behoben ist.

    – Eldar Abusalimov

    16. Oktober 2013 um 8:08 Uhr

  • Und der GCC-Fehler wurde Berichten zufolge behoben. Ich bin mir nicht sicher, ob der Fix es schon in eine Version geschafft hat oder nicht.

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

    13. Juni 2014 um 20:51 Uhr


  • @DevNull: Es hat keinen Einfluss darauf, wie Code kompiliert wird. Vielmehr wirkt es sich darauf aus, wie Code geschrieben wird, dh Leute schreiben entweder nicht-portable Konstrukte ({}) oder schreiben Sie die “richtige” Anzahl von Verschachtelungsebenen passend zu einer bestimmten Version der Strukturdefinition, damit die Warnung verschwindet. Warnungen, die Menschen zum Schreiben veranlassen schlechterer Code um die Warnung zu unterdrücken, gehören zu den schädlichsten Warnungen, die ein Compiler haben kann.

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

    31. Oktober 2016 um 19:15 Uhr


Da Ihr erstes Mitglied in der Struktur ein Array ist, benötigen Sie:

static pkt_t stats = {{0}};

Die äußeren geschweiften Klammern sind für die Struktur, die inneren geschweiften Klammern für das Array. Es gibt jedoch viele andere Möglichkeiten, diese Katze zu häuten. (Statik ist beispielsweise bereits auf Null initialisiert)

  • Was ist, wenn es nicht statisch ist? Nur ein lokaler.

    – Ghasan غسان

    19. Juli 2012 um 0:17 Uhr

  • IDK, haben Sie keine nicht statischen Modulvariablen?

    – Josh Petitt

    19. Juli 2012 um 0:18 Uhr

  • Anscheinend sind Globals auch auf Null initialisiert: stackoverflow.com/questions/8743445/… (siehe Antwort)

    – Josh Petitt

    19. Juli 2012 um 0:20 Uhr

Wenn es sich um eine globale oder eine lokale statische Variable handelt, wird sie automatisch initialisiert. Also einfach:

static pkt_t stats;

  • Guter Fang. Dies wird auch (nicht vom Standard spezifiziert, aber so funktioniert es in allen Situationen der realen Welt) das Objekt in bss anstatt in Daten ablegen, wodurch die Größe der ausführbaren Datei reduziert wird.

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

    20. Juli 2012 um 23:40 Uhr

Eine Möglichkeit besteht darin, jedes Element der Struktur innerhalb der geschweiften Klammern zu initialisieren, anstatt sich auf die implizite Nullfüllung zu verlassen. Für Array-Mitglieder benötigen Sie ein weiteres {}, das wahrscheinlich die Warnung verursacht. Eine andere Möglichkeit besteht darin, die Warnung einfach zu deaktivieren, obwohl dies nicht empfohlen wird, da es auch legitime Fehler abfangen kann.

Setzen Sie dieses gcc-Compiler-Flag: -Wno-missing-braces

Benutzer-Avatar
jarjan13

#define FRAME_TYPE_MAX 3

typedef struct {
    uint32_t incoming[FRAME_TYPE_MAX];
    uint32_t outgoing[FRAME_TYPE_MAX];
    uint32_t timeouts;
    uint32_t crc_errors;
} pkt_t;

static pkt_t stats1= { .incoming={5,6,20},
                       .outgoing={0,0,0},
                       .timeouts=0,
                       .crc_errors=0
                       };

static pkt_t stats2= { {5,6,20},
                       {0,0,0},
                       0,
                       0
                       };

static pkt_t stats3= {{0}};

pkt_t stats4 ;   // global


int main(void)
{

    stats1.incoming[0]= 35;
    stats1.timeouts=25;
    stats2.incoming[2]=10;  
    stats3.outgoing[2]=10;  
    stats4.timeouts=10;
    for (;;);
    }

Benutzer-Avatar
Istvan Siroki

Wenn Sie immer noch die Freude haben, auf einer gcc-Version zu sein, die diese falsche Warnung auslässt, können Sie mit einer Struktur wie dieser in der Frage dieses Problem mit einer einfachen Umstrukturierung wie der folgenden vermeiden:

typedef struct {
    uint32_t timeouts;
    uint32_t crc_errors;
    uint32_t incoming[FRAME_TYPE_MAX];
    uint32_t outgoing[FRAME_TYPE_MAX];
} pkt_t;

static pkt_t stats = {0};

1381440cookie-checkGCC fehlt Klammern um Initialisierer [duplicate]

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

Privacy policy