Hallo zusammen, ich habe ein Problem mit #include und #define. //file: display.h #include<stdio.h> void display(int a); //file: display.cpp #include "display.h" void display(int a) { printf("a = %d\n", a); } //file: control.h #ifdef MAIN extern int a; #else int a; #endif void control(); //file: control.cpp #include "control.h" void control() { a = 10; } //file: test.cpp #define MAIN #include "control.h" #include "display.h" #undef MAIN int main() { control(); display(a); return 0; } Feher: "int a" ist bereits in control.obj definiert. Mindestens ein mehrfach definiertes Symbol gefunden. Kann jemand mir erzählen warum? Vielen Dank Gruß
In Header-Dateien nie Speicher für Variablen reservieren, sondern immer nur den Namen bekannt machen, d.h: In control.h immer nur extern int a; In control.cpp dann int a; Damit können alle Programmteile, die control.h einbinden auf die Variable a in der Datei control.cpp zugreifen. Damit ist die Krücke mittels des defines überhaupt nicht mehr nötig.
> Kann jemand mir erzählen warum? Weil das hier > #ifdef MAIN > extern int a; > #else > int a; > #endif genau verkehrt herum ist.
Eine weitere wichtige Sache: Jeden Header musst(solltest) du mit #ifndef SYMBOLNAME #define SYMBOLNAME beginnen, und entsprechend ganz unten mit #endif abschließen. Als Symbolnamen nimmt man was für den Dateinamen eindeutiges, zB. DISPLAY_H, _DISPLAY_H oder sowas. Hintergrund: Wenn Datei a.h b.h inkludiert, die wiederrum a.h inkludiert, dreht sich die Sache im Kreis. Der Makrocode am Anfang sorgt dafür, dass jeder Header nur genau einmal eingebunden wird. Also in deinem Fall zB:
1 | //file: control.h |
2 | #ifndef CONTROL_H |
3 | #define CONTROL_H |
4 | |
5 | extern int a; |
6 | |
7 | void control(); |
8 | |
9 | #endif |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.