Frage zum Einbinden von Typedefs
-
Hallo!
Ich habe eine grundsätzliche Fragezum Einbinden von typedefs
Ich habe im Hauptprogramm z.B.
typedef struct{ char PartCode[ LABEL_LENGTH ]; char Name [ LABEL_LENGTH ]; char TypeVar [ LABEL_LENGTH ]; char Date [ LABEL_LENGTH ]; char Material[ LABEL_LENGTH ]; }Type_ShellPropertyLabel; Type_ShellPropertyLabel ShellPropertyLabel;
als globale Variable definiert
Jetzt möchte ich eine Funktion einbinden, die diesen Typ verwendet:
Bsp: CheckShells.c
int TokenizeShellLabel(char* PropLabel, Type_ShellPropertyLabel* ShellPropertyLabel, int Debug){ [...] }
und CheckShells.h
int TokenizeShellLabel( char *,// Label to be checked Type_ShellPropertyLabel*, // contains Shell Label Token int // Debug flag: 0: no debug output/ > 0 debug output );
Wie und wo überall muß ich die Typdefinition einbinden, damit das Hauptprogramm und alle Unterprogramme den neuen Typ kennen?
Ciao
OkkaPapa
-
In jeder .c und jeder .h Datei, in der du Type_ShellPropertyLabel brauchst, muss es auch bekannt sein.
Ist es sinvoller den
typedef
in CheckShells.h zu machen? (musst du wissen)
Die globale Variable kann auch im Hauptprogramm bleiben.
Es sei denn, sie ist von Bedeutung für die Funktionen aus CheckShells.c
Dann gehört Variable in CheckShells.c und in CheckShells.h kommt dieextern
Deklaration.In CheckShells.h gehören alle Informationen rein, die andere .c Dateien brauchen um mit CheckShells.c arbeiten zu können.
Dinge die woanders nicht gebraucht werden bleiben in der CheckShells.c
-
DirkB schrieb:
In jeder .c und jeder .h Datei, in der du Type_ShellPropertyLabel brauchst, muss es auch bekannt sein.
Ist es sinvoller den
typedef
in CheckShells.h zu machen? (musst du wissen)
Die globale Variable kann auch im Hauptprogramm bleiben.
Es sei denn, sie ist von Bedeutung für die Funktionen aus CheckShells.c
Dann gehört Variable in CheckShells.c und in CheckShells.h kommt dieextern
Deklaration.In CheckShells.h gehören alle Informationen rein, die andere .c Dateien brauchen um mit CheckShells.c arbeiten zu können.
Dinge die woanders nicht gebraucht werden bleiben in der CheckShells.cHallo!
Da muß ich genauer fragen, damit ich es verstehe:
Wenn ich Typdefinition im Haputprogramm und in einem Unterprogramm verwenden will, wo muß dann die Definition hin, damit ich sie nur ein mal schreiben muß?
Kann ich sowas wie eine Typedef.h verwenden und wo (in die h oder c) Datei muß sie hin?
Brauche ich dann auch eine Typedef.c?Da ich schon ein Hauptprogramm habe, in der die Typdefinitionen global sind: kann/muß ich ein "extern" davor schreiben, damit alle Unterprogramme (die noch folgen werden) die Typdefinitionen kennen?
(Ich weiß, daß, man das nicht machen soll, aber um einen Funktionstest für mich zu machen wärs erstmal hilfreich)Ciao
OkkaPapa
-
In einen Header kommen die Deklarationen, in einem Source File die Definitionen.
Ein Typedef ist eine Deklaration, die keine Definition braucht, also musst du es nur in eine Headerdatei schreiben.
In welche ist dir überlassen, du kannst eine eigene nehmen oder du nimmst eine wo das typedef logisch hinpasst.
-
Nathan schrieb:
In einen Header kommen die Deklarationen, in einem Source File die Definitionen.
Ein Typedef ist eine Deklaration, die keine Definition braucht, also musst du es nur in eine Headerdatei schreiben.
In welche ist dir überlassen, du kannst eine eigene nehmen oder du nimmst eine wo das typedef logisch hinpasst.Hallo!
Habe mich da jetzt (hoffentlich) zu einem logischen Konstrukt hin iteriert...
Noch eine Frage zu globalen Variablen:
Die sollten doch für alle Funktionen (egal ob main oder eine Unterfunktion) sichtbar sein.
Oder muß man die über die Headerdateien bzw. Sourcedateien auch extra bekannt machen?
Ciao
OkkaPapa
-
Ich gehe mal davon aus, dass du mit Hauptprogramm und Unterprogramm verschiedene .c Dateien meinst.
Der Compiler übersetzt jede .c Datei seperat. Damit das erfolgreich ist, müssen alle benötigten Informationen in der .c Datei stehen (ein paar #define können auch als Compilerparamter kommen)
Damit man nicht alles mehrfach schreiben muss, kann man bestehende Dateien mit #include einbinden.
Das wird vor der eigentlichen Compilierung gemacht und ist reiner Textersatz. Wo vorher#include "Dateiname"
steht jetzt der Inhalt vonDateiname
.Nach dem compilieren hast du dann Objectdateien (.o oder .obj).
Diese werden dann vom Linker zu einem Programm zusammen gebunden.Definitionen (Variablen und Funktionen) gehören in eine .c Datei.
Die globale Variable steht in einer .c Datei.
Die Deklaration (mit extern) steht in einer .h Datei.
Durch das extern machst du die Variable bekannt, teilst aber mit, dass diese irgendwo anders definiert ist.Wenn du Variablen in einer .h definierst, enstehen diese in jeder Übersetzungseinheit (Objectdatei) und der Linker hat einen Namenskonflikt, da die Variable mehrfach vorkommt.
-
DirkB schrieb:
Ich gehe mal davon aus, dass du mit Hauptprogramm und Unterprogramm verschiedene .c Dateien meinst..
Ja
DirkB schrieb:
Damit man nicht alles mehrfach schreiben muss, kann man bestehende Dateien mit #include einbinden.
Das wird vor der eigentlichen Compilierung gemacht und ist reiner Textersatz. Wo vorher#include "Dateiname"
steht jetzt der Inhalt vonDateiname
.Hmja... eigentlich klar, trotzdem kriege ich es nicht so richtig hin...
Was ich mache:
Ich habe eine .c mit dem Hauptprogramm (main)
Dann habe ich verschiedene .c und zugehörige .h Dateine in denen ich die Funktionen stehen habe
Diese habe ich mit #include "DATEINAME.h" eingebunden und gebe die .c beim compilieren mit an.Soweit geht alles gut.
Nun habe ich eine riesige Latte an Präprozessordirektiven geschrieben und ich benötige die gleichen Makros in verschiedenen Funktionen.
Damit ich nicht alles mehrfach definieren muß, habe ich die Datei TypeDefs.c und TypeDefs.h (mit denen ich bereits die Typdefinitionen für die structs wie von Dir beschrieben einbinde) genommen und die Makros dort reinkopiert.Obwohl ich in der (Unter-)Funktionsdatei TypeDefs.h includiert habe meckert der Compiler, daß die Makros nicht definiert sind.
Läuft das mit den Präprozessordirektiven anders als mit den Typdefinitionen?
Ciao
OkkaPapa
-
Wenn da nur typedef und #define drin stehen, brauchst du doch keine TypeDefs.c
Gibt es evtl. Probleme mit der Reihenfolge. Wenn du dein TypeDefs.h zu spät einbindest, sind die #define unbekannt.
-
DirkB schrieb:
Wenn da nur typedef und #define drin stehen, brauchst du doch keine TypeDefs.c
Gibt es evtl. Probleme mit der Reihenfolge. Wenn du dein TypeDefs.h zu spät einbindest, sind die #define unbekannt.
Jupp, das wars... Danke!##Ciao
OkkaPapa