Hilfe für Entwickler unter Linux


* Einführung * Installation * Paketmanager * Grundlagen * Shells * Entwicklung * KDE * Skriptsprachen * AWK * PHP * Perl * Apache * Veranstaltungen * Schulungen * Bücher * Netzwerk * OpenOffice * OpenSource * Samba

Entwicklung


© <a href="http://www.fotolia.de/p/29003">Ljupco Smokovski</a> - FOTOLIA
Home
Entwicklung von Programmen unter C
Versionsverwaltung mit RCS und CVS
Mit freundlicher Unterstützung von:

Linux-Kurse und Seminare Linux Kurse
Veranstalter des
Linux-Tag
am Bodensee
2007 und 2008

Kontakt
Haftung
Impressum
Problem Hilfe Startseite


C-Entwicklung

Entwicklung von Programmen unter C

Anhand eines kleinen Beispieles wollen wir in diesem Abschnitt die typische Programmentwicklung unter C (C++) darstellen, d.h.
  1. Erstellen und Editieren des Programmes
  2. Kompilieren
  3. Testen und Debuggen
  4. Weiter mit Punkt 1 oder fertig
Ein Zyklus, der bei der Erstellung kleiner Programme meistens so einmal oder mehrmals duchlaufen wird.

Aber in diesem Artikel geht es nicht um di eallgemeinen Kriterien von Softwareentwicklung oder Softwarezyklen, wie wollen vielmehr an einem ganz einfachen Beispiel zeigen, wie man ein Programm unter der Programmiersprache C erstellt.

Zunächst müssen wir unser Programm mit einem Editor schreiben. Zu empfehlen ist hierzu der Emacs.

Aus einer Shell heraus startet man ihn mit dem Befehl:

emacs hallo.c &

Am besten gleich mit dem Namen des zu schreibenden Programms als Argument:

emacs hallo.c &

Wir schreiben nun ein Programm, was sich zu einer Art Standard für das erste Programm beim Erlernen einer Programmiersprache entwickelt hat.1

Damit sich niemand über eine "Überfremdung" durch die Englische Sprache beklagen kann, schreiben wir "Hallo Welt¨ statt "Hello World":

#include <stdio.h>
main()
{
printf("Hallo Welt!\n");
}

Um ein lauffähiges Programm aus dem Quelltext zu produzieren, braucht man einen sogenannten Compiler. 2
Unter Linux gibt es einen besonders leistungsstarken C-Compiler, den GNU-C-Compiler. 3


gcc hallo.c

Startet man den gcc wie oben beschrieben, erzeugt der Compiler das lauffähige Programm unter dem nicht sehr aussagekräftigen Namen a.out. Will man zum Beispiel das Programm unter dem Namen "hallo" erzeugt haben, so kann man gcc mit der -o Option aufrufen:


gcc -o hallo hallo.c

Um das Programm nun zu starten, braucht man nun nur "hallo" in dem Verzeichnis aufzurufen, in dem das Programm steht.

Was passiert aber, wenn man im Quelltext einen Fehler hat? Um dies zu sehen, bauen wir nun willkürlich ein paar Fehler in unserem Programm ein, d.h. wir tun so, als hätten wir beim Eintippen in der ersten Zeile einen Vertauscher gehabt: Statt stdio schreiben wir stdoi:
(Anmerkung: Jeder Text zwischen "/*" und "*/" gilt für den Compiler als Kommentar und wird bei der Übersetzung nicht beachtet!)

/* Fehlerhafte Version */
#include <stdoi.h>
main()
{
printf("Hallo Welt!\n");
}

Startet man die neue fehlerhafte Version mit "gcc -o hallo hallo.c", dann  meldet der Compiler:

hallo.c:2:19: error: stdoi.h: No such file or directory
hallo.c: In function 'main':
hallo.c:5: warning: incompatible implicit declaration of built-in function 'printf'

Der Compiler meckert zwei Fehler an. Er sagt, dass es keine Dateo oder Verzeichnis mit dem Namen "stdoi.h" gibt, und dass die Funktion printf nicht deklariert worden ist. Die zweite Fehlermeldung ist, wie man richtig vermuten kann, ein Folgefehler, denn in stdio.h werden die Stadandard-Ein- und -Ausgabefunktionen deklariert.

Neben Fehlermeldungen gibt der GCC, ebenso wie andere Compiler, auch Warnungen aus. Eine Warnung ist eine Unstimmigkeit mit der der Compiler zwar "klarkommt", d.h. er kann ein lauffähiges Programm erzeugen, aber dennoch könnte es sein, dass das Programm nicht das tut, was man eigentlich will, da man etwas nicht ganz korrekt gemacht hat.

In unserem Programm verbirgt sich auch so eine Schludrigkeit. Wir können  sie sichtbar machen, indem wir den  gcc mit der Option -Wall (steht natürlich für "Warnings all") aufrufen.:


gcc -Wall -o hallo hallo.c

Im Prinzip empfiehlt es sich immer die Option -Wall zu benutzen und die Warnungen ernst zu nehmen, d.h. das heißt den Code so umzuschreiben, dass es keine Warnungen mehr gibt.

hallo.c:4: warning: return type defaults to 'int'
hallo.c: In function 'main':
hallo.c:6: warning: control reaches end of non-void function

Die Ursache für diese Warnung besteht darin, dass die main-Funktion immer (nach Standard C99) ein Integer, also ein "int" als Return-Wert liefern muss. Es muss also "int main()" statt "main()" heißen. Aber dies alleine genügt noch nicht, da die Funktion einen Return-Wert zurückliefern muss. Das korrekte Programm sieht wie folgt aus:

/* korrekte Version ohne Warnungen */
#include <stdio.h>
int main()
{
printf("Hallo Welt!\n");
return 0;
}

Man sieht, dass es auch bei einfachsten Programmen genügend Fallstricke gibt Fehler zu machen.

Wenn die Programme größer werden, ist es natürlich nicht immer möglich Fehler durch scharfes Anschauen und logisches Nachdenken zu entdecken. Dann ist es Zeit für einen Debugger.
Dazu muss man das Programm zuerst mit der -g kompilieren, dadurch erzeugt man einen Debug-fähigen Code:

gcc -Wall -g -o hallo_dbg hallo.c
Anschließen kann man einen Debugger zum Beispiel den gdb oder den ddd aufrufen:

ddd hallo_dbg 


Fußnoten:
1 Eine Seite mit einer umfassenden Darstellung von Programmiersprachen und Biespielprogrammen für "Hello World" findet man auf  www2.latech.edu/~acm/HelloWorld.shtml.
Im Oktober 2005 befanden sich dort die stattliche Anzahl von 193 Beispielimplementierungen in entsprechen vielen Programmiersprachen.
2 Ein Compiler ist ein Programm, das ein Programm aus einer höheren Programmiersprache  (Quellsprache) in ein äquivalentes Programm einer anderen Sprache (Zielsprache) übersetzt. Bei der Zielsprache handelt es sich meist um eine Maschinensprache oder eine maschinennahe Sprache. .
3GNU steht für GNU is not UNIX. Übrigens bilden GNU und der Linux-Kernel zusammen das, was meistens als LINUX bezeichnet wird.
© Copyright 2007 - 2010, Bernd Klein mit freundlicher Unterstützung von Bodenseo, Linux-Kurse und Schulungen,
Foto linke Seite (Mann mit Strick und Colt): Foto: © Ljupco Smokovski, fotolia 984022