Einbinden der Header-Datei verursacht "expected declaration specifiers"
-
Hallo zusammen,
ich habe mir eine Header-Datei stack.h zu meinem Programm stack.c angelegt, die wie folgt aussehen:/* stack.c */ #include <malloc.h> #include "stack.h" #define MAX_SIZE 4 typedef struct stack { /* Nutze Array-Implementierung fuer Stack. */ int top; /* Zeiger auf das oberste Element im Stack, ein Arrayindex. */ void *s[MAX_SIZE]; /*Array aus void-Zeigern. */ } stack; void push(stack *p,void *elem) { p->top++; p->s[p->top]=elem; } void *top(stack *p) { if(p->top!=-1) return p->s[p->top]; return NULL; } int empty(stack *p) { if(p->top<0) { return -1; /* Fall: Stack ist empty */ } return 0; /* Fall: Stack ist nicht leer. */ } void *pop(stack *p) { if(!empty(p)) { int t=p->top; void *elem = p->s[t]; (p->top)--; return elem; } return NULL; }
#ifndef STACK_H #define STACK_H void push(*stack,int); int empty(*stack); void *top(*stack); void push(*stack,*void); void *pop(*stack); struct stack; #endif
Aber jedes Mal wenn ich versuche die Datei zu compilieren, fuehrt es zu dem im Titel genannten Fehler. Mir ist klar, dass die Main fehlt und sowieso das Compilieren der stack.c scheitert, das Problem ist aber, dass ich diesen generischen Stack in meinem Parser benoetige und es beim dortigen Einbinden mit #include "stack.h" zu demselben Fehler kommt. Ich poste den Quellcode von stack.c weil ich mir nicht sicher bin, ob ich etwas beim Erstellen der Header-Datei falsch gemacht habe, und hoffe ihr könnt mir helfen.
Viele Grüße
Unix1
-
Sollte die Deklaration von
struct stack
nicht ein bisschen weiter oben stehen? Zum Beispiel bevor du sie das erste Mal benutzt?Außerdem muss das
struct stack
heißen, nicht nurstack
, wenn du es benutzt. Außer, du legst dir noch einen passenden typedef an.Wieso steht die Definition von
struct stack
nicht im Header? Das ist doch garantiert nicht nur für interne Benutzung in der stack.c gedacht, sonst bräuchtest du schließlich gar keinen Header.P.S.: Vieles an dem Code wäre eleganter, würdest du dir nicht den Index des obersten Elementes merken, sondern die Anzahl der Elemente. Oder meinetwegen auch eine ähnliche Konvention mit Zeigern. Jedenfalls ist die Idee, dass -1 einen leeren Stack anzeigt, nicht so gut.
P.P.S.: So wirklich glücklich bin ich auch nicht mit der Benutzung der void* zur Datentypabstraktion. Das heißt ja, dass du bei einem pop das Element per Referenz rausgibst, der Nutzer also tunlichst zusehen muss, dass er sich eine Kopie macht, bevor das Element überschrieben wird. Hier wäre wohl eher eine Anwendung für Makros oder gleich mit richtig großer Handlerklasse.
-
Vielen Dank fuer die schnelle Hilfe!
Ich werde deine Tipps berücksichtigen, sie haben sehr geholfen, was aber dann immer noch fuer Schwierigkeiten gesorgt hat war die Art, wie die Prototypen angegeben waren.
Ich weiss nicht ob bei der Verwendung von Pointern generell die verkuerzte Schreibweise des Prototyps nicht funktioniert, aber ich habe einfach die Funktionsheader 1:1 in die Header-Datei geschrieben, bspw void *pop(stack *s) etc. Jetzt funktioniert es!
Vielen Dank!
Viele Gruesse
Unix1
-
Die verkürzte Schreibweise gibt es in C nicht. Wenn es trotzdem funktionieren sollte, dann benutzt du wahrscheinlich einen C++-Compiler für dein C, was nicht gut wäre und schleunigst abgestellt werden sollte, um künftige Fehler und Inkompatibilitäten zu vermeiden.
Die übliche Methode in C ist ein typedef, so wie er im Code deiner stack.c steht. Wenn du den (wie es auch richtig wäre) in die .h-Datei gezogen hast, dann ist es auch korrekt, dass es ohne den "elaborated type specifier" funktioniert.