struct mit Zeiger auf "unbekannte" struct

Gast #4913356
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
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.
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.
Gast
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.
Persönliche Seite
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
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!
Gast
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[];

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.