Forum: Compiler & IDEs struct mit Zeiger auf "unbekannte" struct


von eagle user (Gast)


Lesenswert?

hallo,

ich wünsche mir etwas in dieser Art:
1
typedef struct header {
2
  char *name;
3
  int   version;
4
  int   lang;
5
  int  *defaults;
6
} header;
7
8
header baz1 = {
9
  "baz",
10
  1,
11
  LC_DE_DE,
12
  defaults };
13
14
static int defaults[] = {
15
   1,   // eine Eins
16
   2,   // mehr
17
  88,   // ganz viele
18
  -1 }; // das Ende

Das geht so nicht, weil defaults[] bei der baz1-Initialisierung nicht 
bekannt ist. Ich mag die Reihenfolge aber nicht umdrehen, weil die Liste 
hinter defaults[] in Wirklichkeit sehr lang und langweilig ist. Die 
ersten Zeilen von baz1 sind viel interessanter und könnten gerne am 
Anfang der Datei stehen.

Mit Funktionen geht es doch auch, geht das nicht so ähnlich für Daten?

von Stefan E. (sternst)


Lesenswert?

Google nach "forward declaration".

von Peter II (Gast)


Lesenswert?

Stefan E. schrieb:
> Google nach "forward declaration".

hilft hier aber nicht weiter.

von A. S. (Gast)


Lesenswert?

Peter II schrieb:
> hilft hier aber nicht weiter.

warum nicht? Damit könnte er doch "static int defaults[];" in der Zeile 
vor baz1 schreiben. Für den Compiler reicht es, den Rest mach der 
Linker.

von Peter II (Gast)


Lesenswert?

Achim S. schrieb:
> warum nicht? Damit könnte er doch "static int defaults[];" in der Zeile
> vor baz1 schreiben. Für den Compiler reicht es, den Rest mach der
> Linker.

weil der Compiler schon weiß das es ein Zeiger ist, mehr muss er gar 
nicht wissen. Es würde nur helfen wenn es kein Zeiger ist.

von Stefan E. (sternst)


Lesenswert?

Peter II schrieb:
> weil der Compiler schon weiß das es ein Zeiger ist, mehr muss er gar
> nicht wissen. Es würde nur helfen wenn es kein Zeiger ist.

Er muss aber wissen, dass eine Variable mit Namen defaults existiert und 
welchen Typ sie hat. Ohne forward declaration weiß er das an der Stelle 
ihrer ersten Verwendung nicht.

von Peter II (Gast)


Lesenswert?

Stefan E. schrieb:
> Er muss aber wissen, dass eine Variable mit Namen defaults existiert und
> welchen Typ sie hat. Ohne forward declaration weiß er das an der Stelle
> ihrer ersten Verwendung nicht.

ok, ich hatte vermutet er meckert schon beim typedef.

von Stefan E. (sternst)


Lesenswert?

Peter II schrieb:
> ok, ich hatte vermutet er meckert schon beim typedef.

Ist auch ein wenig gemein vom OP, Struct-Member und Variable gleich zu 
benennen. ;-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

eagle user schrieb:

Als GNU-Erweiterung geht eine tentative Definition vor baz1:
1
static int defaults[];
2
3
header baz1 = { ..., defaults };
4
 
5
static int defaults[] = { ... };

Mit Standard-C braucht's im Tentative die Array-Größe:
1
static int defaults[42];
2
3
header baz1 = { ..., defaults };
4
 
5
static int defaults[42] = { ... };

Oder, wenn defaults[] zu hässlich in der Quellen ist, einfach in einen 
Header stecken.  Dann hat's auch nur eine kurze Zeile.

von eagle user (Gast)


Lesenswert?

Johann L. schrieb:

> Als GNU-Erweiterung geht eine tentative Definition vor baz1:
> static int defaults[];

Das sieht gut und logisch aus, geht aber streng genommen nicht, sprich, 
wenn man -pedantic benutzt. Ansonsten geht es mit -std=c99, c11, gnu11.

> Mit Standard-C braucht's im Tentative die Array-Größe:
> static int defaults[42];

Das sieht nicht so gut aus, weil man denkt, es werden 2 Arrays erzeugt. 
Außerdem muss man die Größe kennen oder immer die maximale Größe nehmen. 
Ich brauche aber viele solche Dateien mit ganz unterschiedlich vielen 
Elementen.

Wahrscheinlich überlasse ich das dem Linker, also nicht static und vorne 
dran ein extern int defaults[];

Ja, man kann es mir nicht recht machen. Deshalb ein extra dickes Danke!

von A. S. (Gast)


Lesenswert?

eagle user schrieb:
> Wahrscheinlich überlasse ich das dem Linker, also nicht static und vorne
> dran ein extern int defaults[];

Sorry für meinen ersten Post, wo ich "extern" vergessen habe. Natürlich 
geht static und extern zusammen, also

extern static int defaults[];

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Achim S. schrieb:
> Natürlich geht static und extern zusammen

Magst Du das nochmal genauer erläutern?

von Markus F. (mfro)


Lesenswert?

Achim S. schrieb:
> extern static int defaults[];

Das ist die Übersetzung von: "bloß daß Du's weißt: ich sag' nix" ;).

von A. S. (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
>>Achim S. schrieb:
>> Natürlich geht static und extern zusammen
>
> Magst Du das nochmal genauer erläutern?

Freitag morgen nach Weiberfastnacht: Bitte bis Aschermittwoch alle post 
von heute vergessen!! Melde mich dann wieder

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Achim S. schrieb:
> Melde mich dann wieder

Auf daß der Schädel nicht zu sehr brummen möge ...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

eagle user schrieb:
> Johann L. schrieb:
>> Mit Standard-C braucht's im Tentative die Array-Größe:
>> static int defaults[42];
>
> Das sieht nicht so gut aus, weil man denkt, es werden 2 Arrays erzeugt.

Diese "denkt man", es würden 2 Arrays erzeugt?  Im Sprachstandard ist 
das klar geregelt.

von eagle user (Gast)


Lesenswert?

Naja, der erste Eindruck des unbedarften Lesers...
Hier (mir) geht es schließlich um Schönheit am Arbeitsplatz ;)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

eagle user schrieb:
> Hier (mir) geht es schließlich um Schönheit am Arbeitsplatz ;)

Dann nimm Lingua Romana Perligata, dann kannst du in Latein schreiben.

Aber selbst das wird dir nicht ersparen, solide Sprachkenntnis zu 
erwerben für den Einsatz am "Arbeitsplatz".

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.