| Zeile 10: | Zeile 10: | ||
'''C++''' wurde 1983 von Bjarne Stroustoup veröffentlicht, um C mit Sprachmitteln der objektorientierten Programmierung zu erweitern. Da C++ somit eine Weiterentwicklung von [[C]] ist, sollte man sich auch den Wikiartikel über [[C]] zu Gemüte führen. | '''C++''' wurde 1983 von Bjarne Stroustoup veröffentlicht, um C mit Sprachmitteln der objektorientierten Programmierung zu erweitern. Da C++ somit eine Weiterentwicklung von [[C]] ist, sollte man sich auch den Wikiartikel über [[C]] zu Gemüte führen. | ||
| − | = Überblick = | + | == Überblick == |
Die meisten C++ Features sind ohne zusätzlichen Aufwand sofort verfügbar. Nur für die folgenden Features werden Hilfsfunktionen benötigt, welche der C++ Compiler von Haus aus nicht zur Verfügung stellt: | Die meisten C++ Features sind ohne zusätzlichen Aufwand sofort verfügbar. Nur für die folgenden Features werden Hilfsfunktionen benötigt, welche der C++ Compiler von Haus aus nicht zur Verfügung stellt: | ||
* [[C++#Startup-Code | Startup-Code]] | * [[C++#Startup-Code | Startup-Code]] | ||
| Zeile 20: | Zeile 20: | ||
Da jeder Compilerhersteller eine eigene ABI (= Application Binary Interface) zur Verfügung stellt, sind auch die Funktionsnamen sowie auch der Funktionsumfang, von Compiler zu Compiler verschieden. | Da jeder Compilerhersteller eine eigene ABI (= Application Binary Interface) zur Verfügung stellt, sind auch die Funktionsnamen sowie auch der Funktionsumfang, von Compiler zu Compiler verschieden. | ||
| − | = Startup-Code = | + | == Startup-Code == |
| − | |||
Dieser Code wird ausgeführt, bevor die main-Funktion des Programmes/Kernels aufgerufen wird und muss zumindest die Kommandozeilenargumente, mit denen das Programm aufgerufen wurde, an die main-Funktion weiterreichen. | Dieser Code wird ausgeführt, bevor die main-Funktion des Programmes/Kernels aufgerufen wird und muss zumindest die Kommandozeilenargumente, mit denen das Programm aufgerufen wurde, an die main-Funktion weiterreichen. | ||
| − | = rein virtuelle Funktionen = | + | == rein virtuelle Funktionen == |
| − | |||
Wenn eine Klasse eine rein virtuelle Funktion nicht implementiert hat und diese Funktion aufgerufen wird, wird zur Fehlerbehandlung eine Hilfsfunktion aufgerufen, welche im Normalfall das Programm beendet. | Wenn eine Klasse eine rein virtuelle Funktion nicht implementiert hat und diese Funktion aufgerufen wird, wird zur Fehlerbehandlung eine Hilfsfunktion aufgerufen, welche im Normalfall das Programm beendet. | ||
| − | == g++ == | + | === g++ === |
<cpp> | <cpp> | ||
// Lizenz: public domain | // Lizenz: public domain | ||
| Zeile 39: | Zeile 37: | ||
</cpp> | </cpp> | ||
| − | = globale/statische Objekte = | + | == globale/statische Objekte == |
| − | |||
Da diese vor dem Eintritt in die main-Funktion initialisiert sein sollen, müssen auch Konstruktoren und Destruktoren aufgerufen werden. | Da diese vor dem Eintritt in die main-Funktion initialisiert sein sollen, müssen auch Konstruktoren und Destruktoren aufgerufen werden. | ||
| − | == g++ == | + | === g++ === |
| − | |||
Die Konstruktion der globalen/statischen Objekte ist unter g++ immer gleich. Nur die Destruktion der Selben hängt von der Verwendung des configure-flags --enable-__cxa_atexit und vom Kommandozeilenparameter -fuse-cxa-atexit / -fno-use-cxa-atexit ab. | Die Konstruktion der globalen/statischen Objekte ist unter g++ immer gleich. Nur die Destruktion der Selben hängt von der Verwendung des configure-flags --enable-__cxa_atexit und vom Kommandozeilenparameter -fuse-cxa-atexit / -fno-use-cxa-atexit ab. | ||
| − | === Konstruktoren === | + | ==== Konstruktoren ==== |
| − | |||
G++ erstellt eine "ctors*" Sektion, welche ein Array aus Funktionszeigern ist. Diese Funktionszeiger zeigen jeweils auf einen Konstruktor. Man muss nun nur dieses Array durchgehen und alle Funktionen aufrufen und schon hat man alle globalen/statischen Objekte initialisiert. | G++ erstellt eine "ctors*" Sektion, welche ein Array aus Funktionszeigern ist. Diese Funktionszeiger zeigen jeweils auf einen Konstruktor. Man muss nun nur dieses Array durchgehen und alle Funktionen aufrufen und schon hat man alle globalen/statischen Objekte initialisiert. | ||
| Zeile 73: | Zeile 68: | ||
Diese Funktion muss explizit aufgerufen werden bevor globale/statische Objekte verwendet werden. Dies kann beispielsweise im [[C++#Startup-Code | Startup-Code]] geschehen. | Diese Funktion muss explizit aufgerufen werden bevor globale/statische Objekte verwendet werden. Dies kann beispielsweise im [[C++#Startup-Code | Startup-Code]] geschehen. | ||
| − | === Destruktoren (ohne --enable-__cxa_atexit und ohne -fuse-cxa-atexit) === | + | ==== Destruktoren (ohne --enable-__cxa_atexit und ohne -fuse-cxa-atexit) ==== |
| − | |||
G++ erstellt eine "dtors*" Sektion, analog zur "ctors*" Sektion und speicher dort wiederum ein Array aus Funktionszeigern. Diesmal zeigen diese Funktionszeiger aber auf Destruktoren. | G++ erstellt eine "dtors*" Sektion, analog zur "ctors*" Sektion und speicher dort wiederum ein Array aus Funktionszeigern. Diesmal zeigen diese Funktionszeiger aber auf Destruktoren. | ||
| − | === Destruktoren (mit --enable-__cxa_atexit oder mit -fuse-cxa-atexit) === | + | ==== Destruktoren (mit --enable-__cxa_atexit oder mit -fuse-cxa-atexit) ==== |
| − | |||
Im Konstruktor eines globalen/statischen Objekts wird die folgende Funktion aufgerufen: | Im Konstruktor eines globalen/statischen Objekts wird die folgende Funktion aufgerufen: | ||
| Zeile 135: | Zeile 128: | ||
</cpp> | </cpp> | ||
| − | = new/delete = | + | == new/delete == |
Um dynamisch Objekte mit new erstellen bzw. mit delete zerstören zu können muss man die vier Operatoren | Um dynamisch Objekte mit new erstellen bzw. mit delete zerstören zu können muss man die vier Operatoren | ||
*new | *new | ||
| Zeile 166: | Zeile 159: | ||
</cpp> | </cpp> | ||
| − | = RTTI = | + | == RTTI == |
RTTI (Runtime Type Information) wird am besten innerhalb des Kernels komplett deaktiviert. Mit g++ geschieht dies mittels des Kommandozeilenparameter ''-fno-rtti''. | RTTI (Runtime Type Information) wird am besten innerhalb des Kernels komplett deaktiviert. Mit g++ geschieht dies mittels des Kommandozeilenparameter ''-fno-rtti''. | ||
| − | = Exceptions = | + | == Exceptions == |
| − | |||
Exceptions sollten auch am besten innerhalb des Kernels deaktiviert werden. Mit g++ können Exceptions über den Kommandozeilenparameter ''-fno-exceptions'' deaktiviert werden. | Exceptions sollten auch am besten innerhalb des Kernels deaktiviert werden. Mit g++ können Exceptions über den Kommandozeilenparameter ''-fno-exceptions'' deaktiviert werden. | ||
| − | = Links = | + | == Links == |
* [http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2006/n2135.pdf Draft des C++ Standards] | * [http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2006/n2135.pdf Draft des C++ Standards] | ||
* [http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1836.pdf Draft des TR1 (=Technical Report 1)] | * [http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1836.pdf Draft des TR1 (=Technical Report 1)] | ||
| Zeile 179: | Zeile 171: | ||
* [http://www.codesourcery.com/cxx-abi/abi-eh.html g++ ABI: Exception Handling] (Nicht nur die ABI für Itanium, sondern auch für x86 und x86-64) | * [http://www.codesourcery.com/cxx-abi/abi-eh.html g++ ABI: Exception Handling] (Nicht nur die ABI für Itanium, sondern auch für x86 und x86-64) | ||
* [http://www.osdev.org/wiki/C_PlusPlus OSDev.org wiki] | * [http://www.osdev.org/wiki/C_PlusPlus OSDev.org wiki] | ||
| − | == C++0x == | + | |
| + | === C++0x === | ||
* [http://video.google.de/videoplay?docid=2768126766555555011&q=c%2B%2B0x New Features in the Next C++ Standard] (video) | * [http://video.google.de/videoplay?docid=2768126766555555011&q=c%2B%2B0x New Features in the Next C++ Standard] (video) | ||
* [http://video.google.de/videoplay?docid=5262479012306588324&q=c%2B%2B0x Initialization Lists] (video) | * [http://video.google.de/videoplay?docid=5262479012306588324&q=c%2B%2B0x Initialization Lists] (video) | ||