Die Boost C++ Bibliotheken


Kapitel 1: Einführung


Inhaltsverzeichnis

Dieses Buch ist unter einer Creative Commons-Lizenz lizensiert.


1.1 C++ und Boost

Die Boost C++ Bibliotheken sind eine Sammlung moderner, auf dem C++ Standard basierender Bibliotheken. Ihr Quellcode steht unter der Boost Software Lizenz zur Verfügung, die es gestattet, die Bibliotheken kostenlos einzusetzen, zu verändern und zu verbreiten. Die Bibliotheken sind plattformunabhängig und unterstützen neben weitverbreiteten Compilern auch zahlreiche weniger bekannte Compiler.

Verantwortlich für die Entwicklung und Veröffentlichung der Boost C++ Bibliotheken ist die Boost-Community. Es handelt sich hierbei um eine relativ große Gruppe an C++-Entwicklern aus aller Welt, die sich online über die Website www.boost.org und Mailinglisten koordinieren. Ziel dieser Community ist es, qualitativ hochwertige Bibliotheken zu entwickeln und zu sammeln, die den C++ Standard ergänzen. Bibliotheken, die sich in der Praxis bewähren und in der Entwicklung von C++-Programmen eine große Bedeutung erlangen, besitzen gute Chancen, eines Tages in den C++ Standard aufgenommen zu werden.

Die Boost-Community entstand um das Jahr 1998 herum, als die erste Version des C++ Standards veröffentlicht wurde. Sie ist seitdem kontinuierlich gewachsen und spielt eine große Rolle in der Standardisierung von C++. Auch wenn es keine direkte Beziehung zwischen der Boost-Community und dem Standardisierungsgremium von C++ gibt, sind einige Entwickler in beiden Gruppen aktiv. Die nächste Version des C++ Standards, die voraussichtlich im Jahr 2011 verabschiedet werden wird, wird um einige Bibliotheken erweitert werden, die ihren Ursprung in der Boost-Community haben.

Die Boost C++ Bibliotheken bieten sich vor allem dann an, wenn Sie den C++ Standard ausgeschöpft haben und nach neuen Möglichkeiten suchen, die Produktivität in Ihren Projekten zu steigern. Da die aktuelle Version des C++ Standards aus dem Jahr 2003 stammt und die Entwicklung in C++ seitdem nicht stehen geblieben ist, stehen Ihnen durch die Boost C++ Bibliotheken zahlreiche Neuentwicklungen zur Verfügung. Anstatt auf die nächste Version des C++ Standards zu warten, können Sie dank der Boost C++ Bibliotheken laufend von aktuellen Entwicklungen in C++ profitieren und diese in Ihren Projekten verwenden.

Aufgrund des hervorragenden Rufs, den die Boost C++ Bibliotheken genießen, stellen Kenntnisse im Umgang mit diesen Bibliotheken einen beruflichen Vorteil dar. So ist es zum Beispiel nicht ungewöhnlich, in Bewerbungsgesprächen nach Kenntnissen zu den Boost C++ Bibliotheken gefragt zu werden. Denn Entwickler, die die Boost C++ Bibliotheken kennen, wissen über aktuelle Entwicklungen in C++ Bescheid und können modernen C++-Code schreiben und verstehen.


1.2 Entwicklungsprozess

Die Entwicklung von Boost C++ Bibliotheken ist nur möglich, wenn Entwickler oder Organisationen diese mit großem Engagement betreiben. Weil nur Bibliotheken von Boost akzeptiert werden, die tatsächlich in der Praxis existierende Probleme lösen, ein überzeugendes Design besitzen, in modernem C++ entwickelt sind und darüberhinaus verständlich dokumentiert sind, steckt in jeder einzelnen Boost C++ Bibliothek eine Menge Arbeit.

Grundsätzlich steht es jedem C++-Entwickler frei, sich in der Boost-Community zu engagieren und neue Bibliotheken vorzuschlagen. Damit aus einer Idee aber tatsächlich eines Tages eine Boost C++ Bibliothek wird, ist es unausweichlich, selbst viel Zeit und Arbeit zu investieren. Dabei ist es von Vorteil, in den Boost-Mailinglisten mit anderen Entwicklern und potentiellen Anwendern über Anforderungen und Lösungen zu diskutieren.

Neben Boost C++ Bibliotheken, die tatsächlich aus dem Nichts erschaffen werden, können auch existierende C++-Bibliotheken zur Integration in Boost vorgeschlagen werden. Da für diese Bibliotheken die gleichen Anforderungen gelten wie für Bibliotheken, die speziell zur Integration in Boost entwickelt wurden, sind jedoch unter Umständen größere Änderungen erforderlich.

Ob eine Bibliothek in Boost aufgenommen wird oder nicht, hängt vom Ausgang eines Reviews ab. Entwickler von Bibliotheken können ein Review beantragen, das rund zehn Tage dauert. Während dieses Zeitraums sind andere Entwickler aufgefordert, eine Bibliothek zu bewerten. Je nachdem, wie viele positive und negative Bewertungen eingehen, entscheidet der Review Manager, ob die Bibliothek in Boost aufgenommen wird oder nicht. Da einige Entwickler während eines Reviews unter Umständen zum ersten Mal mit einer Bibliothek arbeiten, ist es auch nicht ungewöhnlich, wenn es während des Reviews weitere Änderungswünsche an der Bibliothek gibt.

Sollte eine Bibliothek aus technischen Gründen abgelehnt werden, ist es durchaus möglich, die Bibliothek zu überarbeiten und für eine neue Version ein neues Review zu beantragen. Wird eine Bibliothek jedoch abgelehnt, weil sie keine praxisrelevanten Probleme löst oder eine nicht überzeugende Lösung für ein praxisrelevantes Problem bietet, wird sie wahrscheinlich auch in einem neuen Review durchfallen.

Nachdem jederzeit neue Bibliotheken in Boost aufgenommen werden können, wird alle drei Monate eine neue Version der Boost C++ Bibliotheken veröffentlicht. So werden in diesem Buch Bibliotheken der Version 1.42.0 besprochen, die im Februar 2010 veröffentlicht wurde.

Beachten Sie, dass es darüberhinaus Bibliotheken gibt, die in Reviews akzeptiert wurden und sich offiziell Boost C++ Bibliothek nennen dürfen, jedoch noch nicht in den alle drei Monate stattfindenden Releases der Boost C++ Bibliotheken auftauchen. Diese Bibliotheken müssen manuall installiert werden, bis sie in die Releases eingebunden sind.


1.3 Installation

Die Boost C++ Bibliotheken stehen als Quellcode zur Verfügung. Während die meisten dieser Bibliotheken ausschließlich aus Headerdateien bestehen, die direkt verwendet und in Projekten eingebunden werden können, müssen einige Bibliotheken kompiliert werden. Um die Installation der Boost C++ Bibliotheken für Entwickler so einfach wie möglich zu gestalten, steht mit Boost Jam ein automatisierter Installationsprozess zur Verfügung. Anstatt Bibliotheken einzeln zu überprüfen und dann gegebenenfalls zu kompilieren, kann mit Boost Jam das Gesamtpaket automatisch installiert werden. Boost Jam unterstützt dabei zahlreiche Betriebssysteme und Compiler und weiß dank Konfigurationsdateien, welche Bibliotheken wie zu kompilieren sind.

Um mit Hilfe von Boost Jam die Boost C++ Bibliotheken automatisch zu installieren, wird auf ein Programm namens bjam zugegriffen. Dieses Programm wird seinerseits in Form von Quellcode zur Verfügung gestellt. Für einige Betriebssysteme inklusive Windows und Linux kann bjam jedoch auch als bereits kompiliertes Programm heruntergeladen werden.

Wenn bjam selbst kompiliert werden soll, muss lediglich ein Skript namens build ausgeführt werden, das in der Archivdatei mit dem Quellcode von bjam enthalten ist. Dieses Skript steht außerdem für verschiedene Betriebssysteme zur Verfügung. Unter Windows ist das Skript als Batch-Datei build.bat implementiert. Unter Linux heißt die Datei build.sh.

Wenn build ohne Kommandozeilenparameter aufgerufen wird, versucht das Skript automatisch, einen Compiler zu finden und bjam mit diesem zu kompilieren. Über einen Kommandozeilenparameter kann jedoch angegeben werden, welcher C++-Compiler verwendet werden soll. Dieser Kommandozeilenparameter wird als Toolset bezeichnet. So unterstützt build unter Windows zum Beispiel die Toolsets vc7, vc8 und vc9, mit denen verschiedene Versionen des Microsoft C++-Compilers ausgewählt werden können. Mit build vc9 wird also angegeben, dass bjam mit dem C++-Compiler aus Visual Studio 2008 kompiliert werden soll. Unter Linux werden unter anderem die Toolsets gcc und intel-linux unterstützt, mit denen die C++-Compiler von GCC und Intel ausgewählt werden.

Das ausführbare Programm bjam müssen Sie - egal, ob als ausführbare Datei heruntergeladen oder selbst kompiliert - in Ihr Boost-Verzeichnis kopieren. Sie können dann bjam direkt ohne Kommandozeilenparameter starten, um die Boost C++ Bibliotheken zu kompilieren und zu installieren. Da in diesem Fall Standardeinstellungen verwendet werden, die nicht immer empfehlenswert sind, sollten Sie jedoch die wichtigsten Optionen von bjam kennen:

  • Mit der Angabe von stage oder install wählen Sie aus, ob die Boost C++ Bibliotheken in ein Unterverzeichnis stage oder systemweit installiert werden sollen. Was systemweit bedeutet, hängt dabei vom Betriebssystem ab. Unter Windows zum Beispiel ist das Zielverzeichnis C:\Boost, unter Linux /usr/local. Sie können das Zielverzeichnis bei Angabe von install jedoch über die Option --prefix explizit einstellen.

  • Wenn Sie bjam ohne Angabe von Kommandozeilenparametern aufrufen, wird automatisch nach einem Compiler gesucht. Sie können jedoch auch einen Compiler auswählen, indem Sie ein Toolset über die Option --toolset angeben. So können Sie unter Windows den Microsoft C++-Compiler aus Visual Studio 2008 auswählen, indem Sie bjam mit --toolset=msvc-9.0 aufrufen. Unter Linux wählen Sie den C++-Compiler von GCC mit --toolset=gcc aus.

  • Über den Kommandozeilenparameter --build-type wird angegeben, welche Versionen der Bibliotheken erstellt werden sollen. Standardmäßig ist dieser Kommandozeilenparameter auf minimal gesetzt, was bedeutet, dass lediglich Release-Versionen erstellt werden. Das kann vor allem ein Problem für Entwickler werden, die Debug-Versionen ihrer Projekte mit Visual Studio oder GCC erstellen wollen. Da diese Compiler automatisch versuchen, gegen Debug-Versionen der Boost C++ Bibliotheken zu linken, werden sie nicht fündig und brechen das Linken mit einer Fehlermeldung ab. Deswegen kann es empfehlenswert sein, die Option --build-type explizit auf complete zu setzen, um Debug- und Release-Versionen der Boost C++ Bibliotheken zu erstellen. Die Installation kann in diesem Fall sehr lange dauern, was der Grund ist, warum standardmäßig minimal gesetzt ist.

Nachdem Sie nun die wichtigsten Optionen kennengelernt haben, können Sie, wenn Sie mit Visual Studio 2008 arbeiten, zum Beispiel Debug- und Release-Versionen der Boost C++ Bibliotheken mit bjam --toolset=msvc-9.0 --build-type=complete --prefix=D:\Boost install erstellen und in einem Verzeichnis D:\Boost installieren. Wenn Sie Linux einsetzen und mit GCC arbeiten, können Sie die Boost C++ Bibliotheken zum Beispiel mit bjam --toolset=gcc --build-type=complete install in das standardmäßig vorgesehene Systemverzeichnis installieren.

Es existieren zahlreiche weitere Kommandozeilenparameter, mit denen gezielt angegeben werden kann, wie die Boost C++ Bibliotheken zu kompilieren sind. So verwende ich unter Windows typischerweise bjam --toolset=msvc-9.0 debug release link=static runtime-link=shared install. Die Angaben debug und release bewirken, dass sowohl Debug- als auch Release-Versionen der Bibliotheken erstellt werden. Die Angabe link=static bedeutet, dass ausschließlich statische Bibliotheken erstellt werden. Mit runtime-link=shared wiederum wird angegeben, dass die C++ Runtime Bibliothek dynamisch gelinkt wird, was in Visual Studio 2008 die Standardeinstellung für C++-Anwendungen ist.


1.4 Überblick

In der Version 1.42.0 der Boost C++ Bibliotheken sind mehr als 90 Bibliotheken enthalten. Von diesen Bibliotheken werden in diesem Buch die folgenden näher vorgestellt:

Tabelle 1.1. Vorgestellte Bibliotheken
Boost C++ Bibliothek C++ Standard Kurzbeschreibung
Boost.Any Boost.Any stellt mit der Klasse boost::any einen Datentyp zur Verfügung, der Daten beliebiger Typen speichern kann. So kann in einer Variable vom Typ boost::any zum Beispiel zuerst eine Zahl vom Typ int und danach eine Zeichenkette vom Typ std::string gespeichert werden.
Boost.Array TR1 Boost.Array ermöglicht es, ein herkömmliches Array in C++ wie einen echten Container zu behandeln.
Boost.Asio TR2 Mit Boost.Asio können Programme entwickelt werden, die Daten asynchron verarbeiten. Ein Beispiel für die asynchrone Datenverarbeitung sind Netzwerkanwendungen, die mit dieser Bibliothek erstellt werden können.
Boost.Bimap Boost.Bimap stellt eine Klasse boost::bimap zur Verfügung, die ähnlich funktioniert wie std::map. Der entscheidende Unterschied ist, dass bei boost::bimap sowohl nach Schlüsseln als auch nach Werten gesucht werden kann.
Boost.Bind TR1 Boost.Bind ist eine Art Adapter, der ermöglicht, Funktionen als Template-Parameter zu übergeben, selbst wenn der Funktionskopf eigentlich mit dem vom Template erwarteten Parameter inkompatibel ist.
Boost.Conversion Boost.Conversion bietet drei Cast-Operatoren an, um Down- und Crosscasts durchzuführen und Zahlen zwischen unterschiedlichen Datentypen zu konvertieren.
Boost.DateTime Boost.DateTime kann verwendet werden, wenn Datumsangaben und Uhrzeiten verarbeitet und flexibel formatiert ein- und ausgegeben werden sollen.
Boost.Exception Boost.Exception ermöglicht es, einer geworfenen Ausnahme zusätzliche Daten hinzuzufügen, um in catch-Handlern mehr Informationen zur Verfügung zu haben. Das soll das Debuggen erleichtern und bessere Reaktionen in Ausnahmesituation ermöglichen.
Boost.Filesystem TR2 Boost.Filesystem bietet eine Klasse zum Verarbeiten von Pfadangaben an und zahlreiche Funktionen, um auf Dateien und Verzeichnisse zuzugreifen.
Boost.Format Boost.Format ersetzt std::printf() durch eine typsichere und erweiterbare Klasse boost::format.
Boost.Function TR1 Boost.Function vereinfacht die Definition von Funktionszeigern.
Boost.Interprocess Boost.Interprocess gestattet Programmen, schnell und effizient über gemeinsam genutzte Speicherbereiche miteinander zu kommunizieren.
Boost.Lambda Boost.Lambda ermöglicht die Definition von Funktionen ohne Namen. So kann die Definition und der Aufruf kleiner Funktionen vermieden werden, indem Code dort angegeben und ausgeführt wird, wo andernfalls die Funktion aufgerufen werden müsste.
Boost.Multiindex Mit Boost.Multiindex können neue Container definiert werden, die gleichzeitig mehrere Schnittstellen wie beispielsweise die von std::vector und std::map unterstützen.
Boost.NumericConversion Boost.NumericConversion bietet einen Cast-Operator an, der Zahlen zwischen Datentypen unterschiedlicher Bandbreite sicher konvertiert, ohne dass es einen unbemerkten Über- oder Unterlauf gibt.
Boost.PointerContainer Boost.PointerContainer bietet Container an, die für die Verwaltung dynamisch reservierter Objekte optimiert sind.
Boost.Ref TR1 Die Adapter von Boost.Ref ermöglichen es, Referenzen auf Objekte, die nicht kopiert werden können, an Funktionen zu übergeben, die Kopien erwarten.
Boost.Regex TR1 Boost.Regex bietet Funktionen an, um Texte mit Hilfe regulärer Ausdrücke zu durchsuchen.
Boost.Serialization Mit Boost.Serialization können Objekte serialisiert und zum Beispiel in Dateien gespeichert und später wieder von ihnen geladen werden.
Boost.Signals Boost.Signals ist ein Framework zur Ereignisbehandlung. Es setzt das sogenannte Signal-Slot-Konzept um: Funktionen werden mit Signalen verbunden und automatisch aufgerufen, wenn Signale ausgelöst werden.
Boost.SmartPoiners TR1 Boost.SmartPointers bietet zahlreiche smart pointer an, die die Verwaltung von dynamisch reservierten Objekten vereinfachen.
Boost.Spirit Boost.Spirit ermöglicht die Generierung von Parsern mit Hilfe von EBNF-Produktionsregeln.
Boost.StringAlgorithms In der Bibliothek Boost.StringAlgorithms stehen zahlreiche freistehende Funktionen zur Verfügung, die die Verarbeitung von Strings erleichtern.
Boost.System TR2 Boost.System stellt ein Framework zur Verfügung, um system- und anwendungsspezifische Fehlercodes zu verarbeiten.
Boost.Thread C++0x Boost.Thread ermöglicht es, Multithreaded-Programme zu entwickeln.
Boost.Tokenizer Mit Boost.Tokenizer kann über einzelne Bestandteile eines Strings iteriert werden.
Boost.Tuple TR1 Boost.Tuple bietet eine verallgemeinerte Version von std::pair an. So können in der von Boost.Tuple zur Verfügung gestellten Klasse nicht nur zwei, sondern beliebig viele Daten gruppiert werden.
Boost.Unordered TR1 Boost.Unordered erweitert die aus dem C++ Standard zur Verfügung stehenden Container um boost::unordered_set und boost::unordered_map.
Boost.Variant Boost.Variant ermöglicht die Definition von Datentypen, die ähnlich wie union mehrere Datentypen gruppieren. Der Vorteil von Boost.Variant ist jedoch, dass in dieser Gruppe auch Klassen verwendet werden können - etwas, was mit dem Schlüsselwort union nicht möglich ist.

Während der Technical Report 1 im Jahr 2003 veröffentlicht wurde, stellen die Angaben zur Standardisierung bezüglich C++0x und dem Technical Report 2 lediglich den aktuellen Stand dar. Da weder die nächste Version des C++ Standards noch der Technical Report 2 verabschiedet wurden, kann es Änderungen geben.