Die 10 Gebote der C-Programmierung
-
Du sollst die Warnungen Deines Compilers nicht ignorieren.
-
Du sollst keinen ausführbaren Code in Header-Dateien
schreiben.
-
Du sollst immer Prototypen verwenden.
-
Du sollst, wo immer es möglich ist, "asserts" einsetzen.
-
Du sollst ungültige Zeiger mit NULL kennzeichnen.
-
Du sollst Parameter von Makros immer klammern.
-
Du sollst die Abarbeitungsreihenfolge eines Ausdrucks durch
Klammerung verdeutlichen.
-
Du sollst Test-Ausdrücke immer als expliziten Vergleich
schreiben.
-
Du sollst den Schleifenrumpf und den if- und else-Zweig immer
in geschweiften Klammern {} schreiben.
-
Du sollst nur Standard-C-Datentypen einsetzen und keine eigene
typedefs verwenden.
Anmerkungen:
-
Warnungen sind immer potentielle Fehlerquellen!
-
In Headerdateien sollten nur Preprozessoranweisungen (Definements, Makros)
und Deklarationen (extern-Deklaration von Variablen, tpedefs, Funktionsprotypen)
stehen, auf gar keinen Fall sollten hier Variablen definiert werden.
-
In der guten alten K&R-Zeit (C-Steinzeit) war eines der häufigsten
Fehlerquellen der Aufruf von Funktionen mit fehlenden oder/und falschen
Datentypen. Als Abhilfe gegen diese Fehlerquelle wurde durch das ANSI-Kommitee
Prototypen in den Standard aufgenommen. Prototypen sind die wichtigste
Errungenschaft des ANSI-C-Standards, da damit der Compiler endlich die
Chance hat, den richtigen Aufruf einer Funktion zu überprüfen.
-
Falls Sie nicht wissen, was ein "assert" ist, sollten Sie in Ihrem C-Handbuch
nachschlagen oder sich schnellsten das Buch "Felerfrei
Programmieren mit C und C++" besorgen.
-
Ansonsten sieht man einem Zeiger nicht an, ob es ein gültiger oder
ungültiger Zeiger ist. Auch der Zugriff über einen "falschen"
Zeiger kann gutgehen oder Schaden anrichten, während ein Zugriff über
einen NULL-Zeiger fast immer zu einem Programmabsturz führt und damit
die Fehlerquelle offenbart.
-
Ansonsten kann es zu falschen Ergebnisse führen
Beispiel:
#define SQUARE(x) x * x
liefert als Ergebnis für SQUARE(2+3) 11 (2+3*2+3), anstatt
25.
-
Entgegen anderslautenden Gerüchten verursachen zusätzliche (überflüssige)
Klammern keinen zusätzlichen Code.
-
Ein beliebter Fehler ist die Verwechslung von "=" mit "==".:
if (x = y) ...
Syntaktisch ist beides möglich. Wenn man sich angewöhnt, immer
den Vergleich explizit hinzuschreiben, also
if ((x = y) != 0) ...
wird deutlich, was gemeint ist.
-
Bei späteren Erweiterungen kommt es nicht zu Überraschungen,
wenn man immer klammert
-
Ausnahmen sind erlaubt, aber meist machen typedefs den Code nur schwerer
zu lesen.
Beispiel:
Farbe rot;
Was ist Farbe für ein Datentyp? Ein enum? Oder struct?
Oder vielleicht bloß ein int?
Die Auswahl ist absichtlich auf 10 Regeln beschränkt. Mit jeder weitere
Regeln wächst die Gefahr, dass die Regeln nicht gelesen und eingehalten
werden. Wenn Sie der Meinung sind, dass es wichtigere Regeln gibt als diese
Regeln hier gibt, lassen Sie es mich wissen, welche der Regeln in dieser
Liste ersetzt werden sollte (und warum).
Autor: Oliver Böhm
letzte Änderung: 2. Mai 1999