Index  Referenz Richtlinien Bemerkungen 

Bemerkungen

Hier einige Bemerkungen zu g++, Ausnahmebehandlung, STL, Template-Klassen etc.

STL, Namespaces und der GNU Compiler g++

Header-Dateien

Die Header-Dateien werden in der C++-Standardbibliothek ohne irgendeine Endung eingebunden: Bei C-Header-Dateien wird dabei noch ein "c" im Namen vorangestellt: So ist es möglich, zwischen den beiden zu unterscheiden. Dem GNU Compiler fehlen noch einige der neuen Header-Dateien, z.B. diejenigen für I/O. In solchen Fällen muß man benutzen. In der Praxis hat sich herausgestellt, daß die STL weniger Probleme bereitet, wenn sich der Entwickler an die neuen Regeln hält.

Namensbereiche

Alle Identifier in der C++-Standardbibliothek wurden im Namensbereich std definiert. Um sie "wie gewohnt" zu benutzen, muß hinter der letzten Include-Anweisung stehen. Der GNU Compiler unterstützt zur Zeit keine Namensbereiche - jede using-Anweisung bewirkt eine Warnung. Die Anweisung wird aber akzeptiert. Damit aulib++ auch mit einem anderen Compiler problemlos übersetzt werden kann, sollte man using benutzen.

g++ und die Ausnahmebehandlung

Ausnahmebehandlung und Vererbung

Normalerweise werden in einer Bibliothek mehrere Exception-Klassen definiert. Sie bilden eine Vererbungshierarchie der Art: So ist es möglich, je nach Art des Fehlers, unterschiedlich zu reagieren: aber auch ganz einfach Fehler abzufangen: Der GNU Compiler unterstützt dies leider nicht. Der Typ der mit throw erzeugten Ausnahme muß mit dem in catch() spezifizierten Typen exakt übereinstimmen. In aulib++ wird deshalb nur eine Klasse Exception verwendet.

Ausnahmen und Funktionsdeklarationen

Die Deklaration einer Funktion f, die eine Ausnahme vom Typ Exception auslösen kann, sieht wie folgt aus: Der throw-Ausdruck legt fest, welche Ausnahmen von f ausgelöst werden können. Der GNU Compiler betrachtet solche Deklarationen als Fehler. In der aulib++ existiert deshalb das Makro _throw_exception_, und die Deklaration von f würde so aussehen: Wird die Bibliothek mit g++ übersetzt, dann ersetzt der Precompiler _throw_exception_ durch eine leere Zeichenkette. Wird ein anderer Compiler benutzt, so kann man bei der Übersetzung _throw_exception_ explizit auf throw(Exception) setzen.

Template-Klassen und Typedefs

Wer Template-Klassen benutzt, kann sich das Leben etwas einfacher machen, indem er typedefs einsetzt. Anstatt zu schreiben: kann man zuerst ein typedef hinschreiben:
  und dann die Klasse wie eine ganz normale Klasse verwenden:
  Auf die Art und Weise ist z.B. string in der STL deklariert. Wer merkt es schon, dass es sich um ein typedef und nicht um eine echte Klasse handelt?

Testen von Programmen, Festhalten der Zwischenergebnisse

Nicht jeder sucht nach Fehlern mit Hilfe von gdb (der GNU-Debugger). Beim Testen eines Programms ohne Debugger wird der Programmcode meistens erweitert: hier die Ausgabe eines Zwischenergebnisses, da eine Meldung, dass die Funktion gestartet wurde usw. Sind die Fehler beseitigt, muss man all die Ausgabeoperatoren wieder entfernen. Mit Hilfe eines Makros kann man sich die Arbeit ersparen: Wird beim Uebersetzen des Programms das Makro TEST definiert (g++ -DTEST), so werden die Ausgabeoperationen beruecksichtigt. Ist das Makro nicht definiert, dann laesst der Praeprozessor die Zeilen weg. Eins ist allerdings zu beachten: der Code sollte lesbar sein! Die ifdefs sind deshalb am besten am Anfang bzw. am Ende einer Funktion untergebracht.

In der aulib++ ist fuer die Ausgabe von Zwischenergebnissen das ostream-Objekt cres vorgesehen. Wird bei der Uebersetzung des Programms das Makro LOGFILE (g++ -DLOGFILE) definiert, so werden alle Zwischenergebnisse in die Datei results.log geschrieben, andernfalls ist cres identisch mit cerr. Eine Funktion f koennte nun wie folgt aussehen:
 


Last modified $Id: remarks.htm,v 1.1 1998/01/27 14:42:14 tomczyk Exp tomczyk $