Bug

Liebe eifrige Helfer

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;
}

Datei „funktionen.c“:

#include 
#include 
#include "funktionen.h"

void sag (long eingang)
{
 printf("%ld",eingang);
}

Und schlussendlich die Datei „funktionen.h“:

#ifndef FUNKTIONEN\_H\_INCLUDED
#define FUNKTIONEN\_H\_INCLUDED

#include "funktionen.c"
void sag (long eingang);

#endif // FUNKTIONEN\_H\_INCLUDED

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.

Was ist falsch???

Danke für eure Hilfe
Kalsan

Hallo,

Datei „main.c“:

#include „funktionen.c“

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.

HTH,
Moritz

Hi,
ergänzend zu Mortiz Ausführungen:
Wenn du Probleme hast, poste bitte hier die ganze Fehlermeldung.

mfg, Hans

Hallo Hans

Ich werde zukünftig darauf achten.
Danke für den Hinweis!

Gruss Kalsan

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Moritz

vielen Dank für deine Antwort.
Ich habe mal einfach den Paragraphen

#include "funktionen.c"

entfernt.
Das bringt nichts.

Die genaue Fehlermeldung lautet:
file: funktionen.c line: 6

error: redefinition of 'sag'

und dann noch eine in der gleichen Linie der gleichen Datei:

error: previous definition of 'sag' was here

Danke für deine Hilfe.
Kalsan

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Kalsan,

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;
}

Datei „funktionen.c“:

#include
#include
#include „funktionen.h“

void sag (long eingang)
{
printf("%ld",eingang);
}

Und schlussendlich die Datei „funktionen.h“:

#ifndef FUNKTIONEN_H_INCLUDED
#define FUNKTIONEN_H_INCLUDED

#include „funktionen.c“
void sag (long eingang);

#endif // FUNKTIONEN_H_INCLUDED

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.

MfG Peter(TOO)

Hallo Peter

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]

Hallo,

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

Hallo Motitz

Danke für den Tipp, davon habe ich schon gehört, aber ich hab’s schlicht und einfach vergessen :~/

Gruss
Kalsan

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo 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 :wink:

„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.

MfG Peter(TOO)