struct mit Zeiger auf "unbekannte" struct

Gast #4913356
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?
Gast #4913386
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.
Persönliche Seite #4913746
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.
Gast #4913850
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren