Hallo Welt
Jetzt lagern wir aus (Header)








Aufgabe:

Für kleinere Programme mag es noch funktionieren, wenn man alle Funktionen eines C-Programms in eine Source-Datei schreibt. Spätestens aber wenn die Funktionen in mehreren Programmen verwendet werden sollen, ist es besser diese Funktionen in eigene Dateien zu schreiben die bei Bedarf in das Programm eingebunden werden können.

Für diese Funktionalität gibt es in C/C++ die Präprozessoranweisung #include <iostream.h>. Ähnliche Konstrukte gibt es in Pascal (z.B. uses MeineUnit.pas) bzw. Java (z.B. import java.lang.*;)

Das alte Programm hallo.c wird jetzt in die drei Dateien hallo.c, gruss.h und gruss.c aufgeteilt. Zum einfacheren Compilieraufruf werden wir uns einen Makefile erstellen.

Hier könnt Ihr den Source herunterladen (hallowelt.2.tgz 1.078 Byte)

Hier das Beispiel:

/* gruss.h */
#ifndef _gruss_h
#define _gruss_h

void sprung1(); 
void ausgabe(); 
void ende(); 

#endif

/* gruss.c */
#ifndef _gruss_h
#include <gruss.h>
#endif

//------------
void sprung1() 
//------------
{ 
   printf("\nHier springen wir zum ersten mal"); 
} 

//------------
void ausgabe()
//------------ 
{ 
   printf("\nHallo Welt\n");
} 

//------------
void ende() 
//------------
{ 
   printf("Endsprung\n");
} 


/* hallo1.c */ 
#include <gruss.h>

//----
main() 
//----
{ 
   printf("\nWir starten\n");
   sprung1(); 
   ausgabe(); 
   ende(); 
}
Kompilieren:

Wurde das Programm in der letzten Lektion noch mit

gcc -o hallo1 hallo1.c

kompiliert, so muß diesmal zusätzlich die Datei gruss.c und ein Include-Pfad zur Datei gruss.h angegeben werden:

gcc -o hallo1 -I /home/thomas/c/hallowelt/include gruss.c hallo1.c

bzw.

make -f Makefile1

Wir basteln uns einen Makefile

Da C-Programmierer von Natur aus Faul sind ;-) {siehe nur die teilweise kryptischen Befehle...} werden wir uns jetzt noch eine Datei namens Makefile erstellen. Von jetzt an genügt ein Aufruf von

make

bzw.

make -f Name_der_Makefile_Datei

um unser Programm zu kompilieren.
Standardmäßig sucht make nach einer Datei namens Makefile bzw. makefile.

Anmerkung:
Die Einrückungen im Makefile sind durch zweimaliges drücken der TABULATOR-Taste einzurücken !
Vergesst nicht in den Makefiles den Pfad anzupassen!

# Makefile
# Makefile fuer das Programm "Hallo Welt"
# erstellt von Thomas Gern
# am 10.04.1999
#-------Compilereinstellungen
COMPILER = gcc
LINKER   = gcc
CFLAGS   = -c
LFLAGS   =
#-------Archiviereinstellungen
VERSION  = 2
TAR      = hallowelt
#-------Projekteinstellungen
COMMAND  = hallo1
INCLUDE  = -I /home/thomas/c/hallowelt/include
SOURCES  = gruss.c hallo1.c
OBJFILES = $(SOURCES:.c=.o)
#-------Befehle zum linken, kompilieren und aufraeumen

# linken aller Source-Files
.c.o: $(SOURCES)
        $(COMPILER) $(CFLAGS) $(INCLUDE) -o $@ $< 

# kompilieren aller Object-Files mit make bzw. make ALL
all: $(OBJFILES)
        $(LINKER) $(LFLAGS) $(OBJFILES) -o $(COMMAND)

# loeschen aller erzeugten Object-Files
clean:
        rm $(OBJFILES)

# loeschen aller erzeugten Files
distclean: clean
        rm $(COMMAND)

# alle erzeugten Files loeschen und die Sources zusammen-zippen
tarfile: distclean
        cd ..; tar cfz $(TAR).$(VERSION).tgz $(TAR)
Stuktur des Programmes "Hallo world"

Der Aufbau und die Befehlsabarbeitung entspricht der letzten Version.
Wir könnten jetzt ein zweites Programm schreiben z.B,

/* hallo2.c */ 
#include <gruss.h>

//----
main() 
//----
{ 
   printf("\nWir starten jetzt voll durch mit Hallo Welt Version 2\n");
   sprung1(); 
   ausgabe(); 
   ende(); 
}


und dieses Programm dann mit:

gcc -o hallo2 -I /home/thomas/c/hallowelt/include gruss.c hallo2.c

bzw.

make -f Makefile2

kompilieren. Hierbei ersparen wir es uns, die Funktionen sprung1(), ausgabe() und ende() neu einzugeben.
 
 

Literatur:

C++

[1] U. Breymann. C++ Eine Einführung. Hanser-Verlag, 1997
[2] B. Stroustrup. The design and evolution of C++. Addison-Wesley, 1994

C

[3] A. Koenig. C Traps and Pitfalls. Addison-Wesley, 1989
[4] B. Kernighan, D. Ritchie. The C Programming Language. Prentice Hall

Algorithmen

[5] R. Sedgewick. Algorithms. Addison-Wesley, 1988

Makefiles

[6] M. Sylvester, M. Weber, M. Wielsch. LINUX intern. Data Becker, 1998
[7] jeder gut dokumentierte Sourcecode
 
 

Nächster Themenbereich:

Globale und lokale Variablen
Fragen und Anregungen an: Thomas Gern
Anonyme Emails werden nicht beachtet/beantwortet.