Seite 1 von 2

Funktionen in andere Dateien.

Verfasst: Do Sep 09, 2010 11:34 am
von naums
Ich habe eine main.c und will Funktionen auslagern. Soll heißen, dass ich neue Funktionen in eine write.c bzw write.h auslagern will. Einfaches Beispiel: main.c:

Code: Alles auswählen

int main ()
{
    helloworld();
}

helloworld soll folgendes machen: printf("Hello World\n");

Die Funktion helloworld soll nun ausgelagert werden. Wie mache ich das? Kann mir da mal wer Beispiele für die hello.c und die hello.h zeigen? Danke im Voraus (diesmal richtig geschrieben ;) )

Re: Funktionen in andere Dateien.

Verfasst: Do Sep 09, 2010 11:50 am
von fat-lobyte
Hallo,
um eine Funktion zu verwenden brauchst du zwei Dinge:

1. Deklaration
Das brauchen alle anderen Funktionen (in diesem Fall main()), um deine Funktion zu kennen, und wissen wie man sie aufruft.

2. Definition
Das ist die "Implementierung" deiner Funktion, also der Tatsächliche Code.


Die Definition kann man in andere Kompilationseinheiten auslagern, das heißt in andere .c files, aber auch in Bibliotheken (.a/.so, .lib/.dll).
Die Deklaration muss in der Kompilationseinheit verfügbar sein, die die Funktion verwendet, das macht man meist mit einem Include.


Eine hello.c ist ein einfaches C-File mit deiner Funktion drinnen

hello.c:

Code: Alles auswählen

#include <stdio.h>

void helloworld()
{
    printf("Hello World!\n");
}
Hier habe ich die <stdio.h> inkludiert, da dieses C-File ja printf() verwendet.

Ein hello.h sieht im einfachsten Fall so aus:

Code: Alles auswählen

void helloworld();
Dies reicht eigentlich schon aus, nur kann es passieren dass es mehrfach inkludiert wird - dann gibt es in manchen Fällen Compilerfehler wegen Mehrfachdeklarationen. Dagegen kann man sogenannte "Include Guards" einbauen, das sieht so aus:

Code: Alles auswählen

#ifndef HELLOWORLD_H_INCLUDED
#define HELLOWORLD_H_INCLUDED

void helloworld();

#endif /* ifndef HELLOWORLD_H_INCLUDED */
Das macht folgendes: das ganze ding wird nur gelesen, wenn das Makro HELLOWORLD_H_INCLUDED nicht definiert ist. Wenn es nicht definiert wird, dann ist das erste was es macht es zu definieren. Dadurch wird sichergestellt, das der Header nur ein einziges mal geparst wird.

Das musst du noch in die main.c inkludieren

Code: Alles auswählen

#include "helloworld.h"

int main() { helloworld(); }
Bemerke: hier habe ich <stdio.h> nicht inkludiert, es wird hier nicht benötigt! Ich rufe ja nur helloworld() auf, und nur das muss ich kennen.

Probier das mal aus, und bei den ersten unverständlichen Linkerfehlern (bitte mit Fehlermeldung reinkopiert) meldest du dich mal. Dann machen wir weiter :-)

Re: Funktionen in andere Dateien.

Verfasst: Do Sep 09, 2010 1:48 pm
von Xin
naums hat geschrieben:Die Funktion helloworld soll nun ausgelagert werden. Wie mache ich das? Kann mir da mal wer Beispiele für die hello.c und die hello.h zeigen? Danke im Voraus (diesmal richtig geschrieben ;) )
Eigentlich wollte ich Dir das Make-Tutorial ans Herz legen, weil ich sehr davon ausging, dass es ein entsprechendes Beispielprojekt dabei hatte. Das finde ich aber nicht, bzw. da ist wohl doch keins. Schau es Dir trotzdem an.
Es erklärt nämlich, wie Du mit Make das Beispielprojekt von cppunit kompilieren kannst. Das Projekt schmiert zwar ab (weil es ja getestet werden soll), aber es geht bei Dir ja nicht darum, richtig zu programmieren, sondern richtig zu kompilieren.

Du findest unten einen Link auf ein ZIP-Archiv, in dem es zwei Quellen (main.cpp und stack.cpp) gibt, sowie das Makefile, das beschreibt, wie das dann kompiliert wird.

Re: Funktionen in andere Dateien.

Verfasst: Do Sep 09, 2010 6:57 pm
von naums
@fat-lobyte: Klappt ^^.
Muss eigentlich die Headerfile und die Codefile den gleichen namen haben (also ausgenommen der Dateikennung) ???

@Xin: Danke für deinen Tipp, den schau ich mir auch noch an. :)

Edit: folgender Fehler is nu da:

Code: Alles auswählen

/tmp/ccmG50Wv.o: In function `main':
main.c:(.text+0x7): undefined reference to `helloworld'
collect2: ld returned 1 exit status

Re: Funktionen in andere Dateien.

Verfasst: Do Sep 09, 2010 7:40 pm
von Xin
Welchen Befehl verwendest Du zum kompilieren?

Re: Funktionen in andere Dateien.

Verfasst: Fr Sep 10, 2010 2:36 pm
von naums
gcc -o test src/main.c

Re: Funktionen in andere Dateien.

Verfasst: Fr Sep 10, 2010 2:55 pm
von Xin
Du musst auch den Quellcode angeben, der die Funktion helloworld enthält:

Code: Alles auswählen

gcc -o test src/main.c src/hworld.c

Re: Funktionen in andere Dateien.

Verfasst: Fr Sep 10, 2010 4:45 pm
von naums
verstehe... also muss ich immer die CodeFiles mit angeben. Alle CodeFiles, die ich verwenden will? Also wenn ich 500 Files habe, muss ich die alle angeben? Zum Glück benutze ich Skripte zum Compilieren ;)

Re: Funktionen in andere Dateien.

Verfasst: Fr Sep 10, 2010 5:02 pm
von Xin
naums hat geschrieben:verstehe... also muss ich immer die CodeFiles mit angeben. Alle CodeFiles, die ich verwenden will? Also wenn ich 500 Files habe, muss ich die alle angeben?
Richtig.
naums hat geschrieben:Zum Glück benutze ich Skripte zum Compilieren ;)
Nicht nur Du.

Wenn Du in einem Verzeichnis alle *.c Dateien kompilieren möchtest, kann Dir ein Make-Skript die Dateien entsprechend kompilieren und anschließend alle entstandenen Objektfiles (hier also die lange Liste) anschließend zu Deinem fertigem Programm zusammensetzen.

Buildsysteme sind schon eine praktische Erfindung. ^^

Re: Funktionen in andere Dateien.

Verfasst: Fr Sep 10, 2010 5:44 pm
von naums
Das muss ich mir auch noch bei gelegenheit anguggen. Aber erstmal muss ich meine BeLL machen. Zumindest mal ganz grob anfangen. Bis Anfang 12/2 will ich das fertig haben. :P