Arbeiten mit mehreren Dateien im Projekt (CodeBlocks)

yxy

Lieutenant
Registriert
Juli 2014
Beiträge
552
Hi,
der ein oder andere wird jetzt vermutlich lächeln :D.
Aber ich kenne mich noch nicht so gut mit programmieren (in C) aus.

Und zwar meine Frage:
Bis jetzt habe ich immer das gesamte Programm in eine Datei geschrieben. Also sowohl die main-Funkion als auch alle anderen Funktionen. Das wird auf die Dauer etwas länglich.
Kann ich einzelne Funktionen in separate Dateien schreiben und die Dateien miteinadner verknüpfen?

Bin über jede Antwort dankbar ;)
 
Ja, du kannst modularisieren. Der Quellcode wird in eine andere Datei "ausgelagert". Nehmen wir an du hast 30 Funktionen geschrieben.
Du legst eine .header Datei an mit den Prototypen. Die heist meinetwegen myfunk.h. Dazu den Quellcode in Datei myfunk.c. Kann jetzt mittels #include Anweisung in deine main.c aufgenommen werden.
Die Funktionen müssen dabei aber als "extern" bekannt gemacht werden. In diversen Tutorials findest du genauere Beschreibung zum Einsatz des Schlüsselwortes "extern". Bin jetzt zu faul. :D
 
Schau dir Header(.h) und Source(.c) Dateien an. Gibt genug Stoff dazu im Netz.
 
Nicht nur so in der Art, genau so.

Das #include "my_header.h" z.B. muss dann in jede Source-Datei die die Funktionen nutzen will, die darin enthalten sind.
Normalerweise trennt man auch noch Deklaration und Definition, sodass das Folgende dabei heraus käme:

my_function.h (Deklaration):
Code:
#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H

int sum(int a, int b);

#endif

my_function.c (Definition):
Code:
#include "my_function.h"

int sum(int a, int b)
{
   return a+b;
}

main.c (Include für Nutzung):

Code:
#include "my_function.h"

int main(int argc, char** argv)
{
   result = sum(5, 10);

   return 0;
}

Ich bin mir allerdings nicht sicher, inwieweit man sonst noch Funktionen direkt in den Headern auch definieren kann/soll, denn das geht auch. Musst du dich mal noch weiter einlesen oder zum lernen einfach mal beides probieren.
 
Die Deklaration verstehe ich noch nicht richtig.
Was machst du da genau?
Das andere ist klar.
 
Durch das #include "blabla.h" wird vom Präprozessor der Inhalt der Datei "blabla.h" bei dem Compilieren des Programms dort eingefügt.
Außerdem schreibt man in die Header Dateien nur die Funktionsprototypen und nicht die ausprogrammierte Funktion rein.
Man schreibt den Code nur in die Header-Datei, wenn der Code wenige Zeilen enthält, ansonsten wird die ausprogrammierte Funktion immer in eine eigene "cpp" bzw. "c" Datei geschrieben.
 
Zuletzt bearbeitet:
Ok,
meine Frage war bezüglich folgendem Abschnittes:
#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H

int sum(int a, int b);

#endif

Wie kann man das verstehen?
 
Durch dass #ifndef kannst du sogenannte Präprozessordefinitionen angeben, diese musst du, aber auch deinem Compiler mitteilen, im Visual Studio lässt sich dies über die Projekteigenschaften machen.
Dann werden die Codezeilen, welche sich in diesem "Ausdruck" befinden, übersprungen, wenn es sich z.B. um den Debug Modus hält oder du gerade ein 64bit Anwendung compilierst.

Das sollte für dich erstmal egal sein, und kannst daher #ifndef, #define und #endif aus dem Code streichen^^.
 
ok, und das define brauche ichum die Funktion zu definieren. Muss ich da Großbuchstaben verwenden?
Wozu brauche ich das #endif?
 
Mit dem #endif sagst du wo dieser "Ausdruck" wieder aufhören soll.
An sich ist es egal ob du dass alles Groß oder Klein schreibst, jedoch existieren dafür Konventionen die besagen dass man alles Groß schreiben soll.
Mit :
#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H

#endif

gehst du einfach nur sicher,dass die Datei nur einmal eingebunden wird in deiner "main.c".
Es gibt ja Fälle wo du diesen Code auch in eine andere "c" Datei einbindest, die du auch wiederum in deine main.c einbindest, damit wird einfach verhindert dass, dieser Code doppelt inkludiert wird.
Es gibt auch z.B. :
#pragma once

Das macht genau dass selbe ist jedoch immer von der Entwicklungsumgebung abhängig, ob man dies nutzen kann.
Am besten liest du dich in diesem Thema mal selber ein.
 
Ok, danke für eure Hilfe.
Werde es jetzt mal selber versuchen. :D
Ergänzung ()

Warum bekomme ich den Fehler:

warning: missing whitespace after the macro name
warning: extra tokens at the end of #ifndef directive
?
 
Zuletzt bearbeitet:
Das weiß niemand außer dem Compiler, denn nur der Compiler sieht aktuell was du kompilieren willst. Wenn du eine Warning / Error bekommst wäre es sehr gut mit anzugeben was du da kompilieren willst, denn woher sollen wir wissen was das ist, wenn du es uns nicht zeigst?

Nochmal zu den von DaysShadow #ifndef Dingern. Dieser ganze Block heißt Include guard und ist, wie CloudAc gesagt hat, dazu da zu verhindern, dass du mehrmals deinen Header im Programm stehen hast. #ifndef steht für "if not defined" und prüft ob das was danach steht nicht definiert ist, wenn das der Fall ist wird in der nächsten Zeile weiter gemacht, dort wird mit #define eben dieser Name definiert, falls du also wieder an die Stelle kommst und mit #ifndef prüfst wird diesmal der Name schon definiert sein und dann wird alles bis zum #endif weg gelassen. Das macht der Präprozessor, der vor dem Compiler über deinen Code geht und alles mit # anschaut und auswertet. Für dein Beispiel brauchst du kein Include guard, aber schaden tut es auch nicht, normalerweise sollte jeder Header ein Include guard haben. Das #define brauchst du jedoch nicht für deine Funktion, das hat rein gar nichts mit deiner Funktion zu tun.

Gruß
BlackMark
 
"mehrmals deinen Header im Programm stehen"

Wie kann ich mir das vorstellen?
 
So wie es CloudAc schon geschrieben hat:
CloudAc schrieb:
Es gibt ja Fälle wo du diesen Code auch in eine andere "c" Datei einbindest, die du auch wiederum in deine main.c einbindest, damit wird einfach verhindert dass, dieser Code doppelt inkludiert wird.
Als Beispiel, du hast deine sum.h, die du in main.c inkludierst. Du hast aber auch noch eine calc.h, welche intern auch die sum.h verwendet und diese calc.h inkludierst du auch in main.c. Jetzt hast du aber sum.h zwei mal in main.c inkludiert, einmal direkt und einmal über die calc.h. Um das zu vermeiden gibt es Include guards.

Gruß
BlackMark
 
Ok, jetzt ist erstmal alles klar.
Danke ;)
 
Zurück
Oben