Sophia
-
Zeig mal den Quelltext wo du definierst und wo du deklarierst.
-
In einem vorgegebenen Header TypDef.h steht die Typdefinition für die Funktion:
typedef void (APIENTRYP FUNKTION) (float *ptr);
Dann habe ich einen Header Dek.h und dort deklariere ich die Funktion:
#include TpyDef.h extern FUNKTION funktion;
Dann habe ich eine C-Datei Def.c und dort definiere ich die Funktion:
#include Dek.h void main(void) { funktion = (FUNKTION) getFunktionPointer("funktion"); }
Und dann noch eine C-Datei Use.c und dort nutze ich die Funktion:
#include Dek.h void blah(void { funktion(ptr); }
-
Sophia schrieb:
Hatte versehentlich Benutzername mit Titel verwechselt.
Nun, wenn ich die variable als extern im headerfile deklariere, bekomme ich die Fehlermeldung dass die Variable bereits in einer object-datei definiert wurde.
Die Variable ist übrigens eine Funktion für die ich ein Funktionspointer erst holen muss.
Hallo externe Variablen, schönes Nick
eine Faustregel: header guards
/* mydefs.h */ #ifndef MYDEFS_H #define MYDEFS_H /* der Code für die header Datei soll innerhalb der #define und #endif Preproz. geschrieben werden */ /* Externe variable */ extern int abc; ... #endif
Genau eine Source Datei muss diese Variable richtig deklarieren, damit der Linker seine Arbeit erledigen kann.
/* file1.c */ #include "mydefs.h" /* Externe Variable wird hier deklariert */ int abc; ...
/* file2.c */ #include "mydefs.h" ...
file2.c braucht das int abc nicht, der Linker kümmert sich darum.
-
DU.........Da fehlen doch aber die beiden Anführungzeichen jeweils am Headeranfang- und Ende (also so: "Test.h")
-
Ja, habe ich beim hier reinschreiben vergessen.
Der Fehler ist immernoch da.
-
Wenn ich so wie ich es oben gezeigt mache, bringt er übrigens die Fehlermeldung "nichtaufgelöstes externes Symbol" und zeigt dazu den Typ der Funktion an.
-
Die ganze Geschichte stimmt schon so, wie Supertux das dargelegt hat, nur sollte man das ausschließlich dann so machen, wenn es wirklich gar nicht anders geht.
Man dröselt ja ein Projekt nicht auf zig Dateien auf, um dann ein paar globale Variablen überall 'reinzuzerren.
Bei Winzig- Progs ist es egal, aber wenn man wirklich wiederverwertbaren Code haben mag, kapselt man includes variablenseitig und exportiert zulässige Eingriffe auf interne Variable (Klasse static) als Funktion
.
Die Vorteile im Codehandling machen i.A. die Nachteile von ein paar verbratenen Taktzyklen mehr als wett.
-
Damit du den linker fehler weg bekommst schreib
extern int abc;
ausser halbs der guards oder am besten in die c dateien wo du die globale variable brauchst
mfg
-
spjoe schrieb:
Damit du den linker fehler weg bekommst schreib
extern int abc;
ausser halbs der guards oder am besten in die c dateien wo du die globale variable brauchst
Nein, das ist nicht der Fehler. Das Beispiel von supertux ist schon ok so, bis auf die Tatsache, dass die einmalige Definition entscheidend ist, und nicht Deklaration.
Sophia schrieb:
Dann habe ich eine C-Datei Def.c und dort definiere ich die Funktion:
#include Dek.h void main(void) { funktion = (FUNKTION) getFunktionPointer("funktion"); }
Wo ist die Definition? Ich sehe keine, lediglich eine Zuweisung.
btw:
Ich kann zwar momentan nicht genau sagen, welche Möglichkeiten C bzgl. Funktionstypen bietet, aber sollte man da nicht einen Funktionszeiger nehmen. Also eher sotypedef void (APIENTRYP *FUNKTION)(float *ptr);
-
groovemaster schrieb:
Nein, das ist nicht der Fehler. Das Beispiel von supertux ist schon ok so, bis auf die Tatsache, dass die einmalige Definition entscheidend ist, und nicht Deklaration.
hih, ich bringe beide Begriffe immer durcheinander...