Projekte auf mehrere Dateien aufteilen
Cheat Cheet, Dos and Don’ts
Manchmal ist es sinnvoll, große Projekte in mehrere Dateien aufzuteilen
Teile eines Projekts werden in mehreren Programmen benötigt
Teile bilden einen logischen Zusammenhang (Bibliothek)
Beispiel: Wir verwenden regelmäßig Funktionen / Konstanten zur Kreisberechnung (kreis_umfang
, kreis_flaeche
, pi
)
Aufteilen unseres Programms in zwei Teile: programm.c
und kreis.c
double pi = 3.141592653589793;
double flaeche(double radius) {
return pi * radius * radius;
}
double umfang(double radius) {
return pi * radius * 2;
}
#include <stdio.h>
int main() {
const double rad = 42;
printf("r=%f\U=%f\nA=%f\nPI=%f\n", rad,
kreis_umfang(rad), kreis_flaeche(rad), pi);
return 0;
}
Jetzt müssen wir beide Dateien kompilieren:
gcc [..flags..] -o program program.c kreis.c
Funktioniert leider nicht :-(
Irgendwie müssen wir program.c
mitteilen, dass die gesuchten Funktionen existieren
Erinnerung: Header-Dateien
#ifndef KREIS_H_ // Doppeltes Einbinden des Codes
#define KREIS_H_ // verhindern. WICHTIG!
extern double pi; // Variable pi existiert
double kreis_flaeche(double radius);
double kreis_umfang(double radius);
#endif // #ifndef von oben beenden
In program.c
und kreis.c
noch #include "kreis.h"
hinzufügen
"kreis.h"
und nicht <kreis.h>
Don’t:
Do:
-Wall
und -Wextra
anschaltenDon’t:
#define
-Makros mit etwas außer A-Z
, 0-9
und _
goto
Funktionen sehr oft rekursiv aufrufen (C ist nicht Haskell)
Do:
Rekursion als Iteration schreiben (ist auch schneller)
Quellcode einrücken in einheitlichem Stil
“Sprechende” Variablennamen in einheitlichem Stil
Sinnvolle Kommentare schreiben
if
, while
, …Don’t:
if (a == b && func()) { ...
func
aufgerufen wird if (text1 == text2) { ...
um Strings zu vergleichen
strncmp
und strncasecmp
if (a = 10) { ...