Nach einem grossartigen Erfolgserlebnis habe ich nun beschlossen, w-w-w auch für C-Fragen als Anlaufsstelle Nr.1 zu nutzen, was meine häufige Fragerei erklärt ^^
Und hier ist das Problem:
Ich möchte mein erstes Programm mit mehreren Dateien schreiben. Dazu habe ich drei Dateien erstellt:
Datei „main.c“:
#include
#include
#include "funktionen.c"
#include "funktionen.h"
void sag (long eingang);
int main()
{
printf("Hello world!\n");
sag(15);
return 0;
}
Alle Dateien befinden sich im selben Ordner.
Bei der Komplimation wird gemeldet, dass die Funktion „sag“ irgendwie doppelt genennt wurde, und ich verstehe die Welt (oder besser gesagt meinen PC) nicht mehr.
Das hier ist dein Problem: .c-Dateien bindet man nicht mit #include ein, nur die entsprechenden Header-Dateien. Stattdessen kompiliert man sie getrennt, und linkt sie am Ende dazu.
Sonst gibt es Probleme, wenn mehrere Dateien diese eine Datei einbinden.
Alle Dateien befinden sich im selben Ordner.
Bei der Komplimation beim Compilieren wird gemeldet, dass die Funktion „sag“
irgendwie doppelt genennt wurde, und ich verstehe die Welt
(oder besser gesagt meinen PC) nicht mehr.
Was ist falsch???
„funktionen.c“:
In der 3. Zeile wird „funktionen.h“ eingefügt.
Dort wird in der 4. Zeile „funktionen.c“ nochmals in „funktionen.c“ eingefügt …
Somit wird 2x der Code für die Funktion sag() erzeugt, was dein Compiler bemängelt.
THAT’S IT!!!
Danke vielmals, das Problem ist gelöst.
Ich wusste nicht, dass es gleich zwei Fehler gab - zwei #include zu viel, also habe ich immer eines von beiden gelöscht, ausprobiert, rückgängig gemacht, das andere gelöscht usw. Dank deiner etwas ausführlicheren Erklärung habe ich als Anfänger endlich kapiert.
Dankeschön!
Gruss Kalsan
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Danke vielmals, das Problem ist gelöst.
Ich wusste nicht, dass es gleich zwei Fehler gab - zwei #include zu viel, also habe ich immer eines von beiden
gelöscht, ausprobiert, rückgängig gemacht, das andere gelöscht
usw. Dank deiner etwas ausführlicheren Erklärung habe ich als
Anfänger endlich kapiert.
Üblicherweise baut man in seine Header-Dateien sogenannte „include guards“ ein, die dafür sorgen, dass die Datei nur einmal eingebunden werden kann. Das sieht dann so aus:
/\* datei string\_functions.h \*/
#ifndef \_\_STRING\_FUNCTIONS\_H
#define \_\_STRING\_FUNCTIONS\_H
/\* Rest der Datei hier \*/
#endif
Beim ersten einlesen durch den Präprozessor wird das Symbol \_\_STRING\_FUNCTIONS\_H definiert, beim zweiten mal sorgt das #ifndef dafür, dass der Rest der Datei ignoriert wird.
Dabei baut man dieses Symbol üblicherweise aus dem Dateinamen zusammen, sodass es möglichst eindeutig ist und es nicht zu kollisionenn mit anderen Symbolen kommt.
Wenn man solche "guards" einbaut, kann man ohne Bedenken die .h-Dateien an beliebig vielen Stellen einbinden (üblicherweise einmal pro source-Datei).
Grüße,
Moritz
Üblicherweise baut man in seine Header-Dateien sogenannte
„include guards“ ein, die dafür sorgen, dass die Datei nur
einmal eingebunden werden kann. Das sieht dann so aus:
Das hat er doch gemacht, schau dir mal seine „function.h“ an.
Ohne Guard hätte er eine Endlosschleife mit den includes gehabt
„function.H“ war in „function.C“ eingebunden, was noch normal ist.
Aber in „function.H“ war auch „function.C“ eingebunden und das bezeichnet man als Rekursion.