Forum: Compiler & IDEs Warnung bei nicht (vollst.) init. struct


von Tom K. (ez81)


Lesenswert?

Hallo zusammen,

Gibt es eine Möglichkeit, mit der gcc warnt, wenn ein struct wie im 
Beispiel nicht vollständig initialisiert, aber benutzt wird? Dieser 
Fehler hat mich gerade einiges an Zeit gekostet.
1
#include <stdio.h>
2
3
typedef struct 
4
{
5
    int a;
6
    int b;
7
    int c;
8
} tFoo;
9
10
void doStuff(tFoo* p)
11
{
12
    printf("%d, %d, %d\n", p->a, p->b, p->c);
13
}
14
15
int main(void)
16
{
17
    tFoo x;
18
    x.a = 0;
19
    x.b = 1;
20
    // x.c ist nicht initialisiert.
21
    doStuff(&x);
22
    return 0;
23
}

Ideal wäre, wenn alles außer
1
 
2
tFoo x; x.a = 0; x.b = 0; x.c = 0;
oder
1
tFoo x = {0; 1; 2};
eine Warnung produziert. "gcc -Wall -Wextra -Wuninitialized" tut das 
leider nicht, passendere Optionen habe ich in der manpage nicht 
gefunden.

Grüße,
Tom

von Peter II (Gast)


Lesenswert?

Tom K. schrieb:
> Ideal wäre, wenn alles außer
> tFoo x; x.a = 0; x.b = 0; x.c = 0;

und woher soll der compiler wissen wie lange er warten soll.

tFoo x;
x.a = 0;
x.b = 0; //jetzt müsste ja schon ein fehler kommen weil c nicht 
initalisiert ist.
x.c = 0;

von tobi (Gast)


Lesenswert?

Darf's auch ein ctor sein?

Du könntest die Member als const deklarieren und einen ctor mit
den benötigten Parametern schreiben.

D.h die Member können nur (und müssen) im ctor gesetzt werden, was 
zumindest zu deinem Beispiel passt.




Grüße
Tobi

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du statt einer Zuweisung eine Initialisierung geschrieben
hättest, dann wäre x.c gleich 0 gewesen. ;)

von DirkB (Gast)


Lesenswert?

Warum sollte der Compiler da denn warnen?

Du könntest in doStuff() deine struct auch füllen lassen.
Dann wäre das Programm ja richtig.

von Tom K. (ez81)


Lesenswert?

Danke für alle Antworten!

Ihr habt natürlich recht, die Frage war nicht richtig überlegt. Dass es 
so wie gedacht prinzipbedingt gar nicht funktionieren kann, habe ich 
jetzt eingesehen ;).

Etwas Constructor-Ähnliches ist sicher eine gute Idee, in die Richtung 
wird es gehen. Komplett initialisieren würde sehr unübersichtlich, da 
das (gegebene) struct in meiner Anwendung noch viel mehr Member hat, die 
nicht initialisiert werden müssen.
1
tFoo x;
2
initFoo(&x, 0, 1, 2);
finde ich lesbarer als
1
tFoo x = {0; 1; 2; 0; 0; 0; 0; 0; 0 /* noch viele Nullen mehr */};

Grüße,
Tom

von Rolf Magnus (Gast)


Lesenswert?

Peter II schrieb:
> initFoo(&x, 0, 1, 2);
> finde ich lesbarer alstFoo x = {0; 1; 2; 0; 0; 0; 0; 0; 0 /* noch viele Nullen 
mehr */};

Wenn da nur noch Nullen kommen, brauchst du sie nicht hinzuschreiben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.