kennen:cpp
no way to compare when less than two revisions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | kennen:cpp [2012-02-24 15:16] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== C-Präprozessor ====== | ||
+ | > Wie immer, sollte man Makro-Zaubertricks vermeiden. | ||
+ | >> --- Bjarne Stroustrup [C++ 3. Aufl., S. 214] | ||
+ | |||
+ | Der C-Präprozessor cpp ist ein beim | ||
+ | [[.: | ||
+ | vorgeschaltetes Programm. | ||
+ | Er ersetzt [[# | ||
+ | sorgt für [[#bedingte Übersetzung]] | ||
+ | und kann [[#Dateien einbinden]]. | ||
+ | Er wird von Zeilen gesteuert, | ||
+ | die mit dem Doppelkreuz ''#'' | ||
+ | Die Syntax dieser Zeilen hat mit C++ nur sehr wenig zu tun. | ||
+ | |||
+ | ===== Textersatz ===== | ||
+ | ==== Makros ==== | ||
+ | Makros sind benannte " | ||
+ | |||
+ | Syntax: | ||
+ | |||
+ | > ''# | ||
+ | <code cpp> | ||
+ | #define MfG "Mit freundlichem Gruss" | ||
+ | #define PI 3.1415926535 | ||
+ | </ | ||
+ | |||
+ | ==== Makrofunktionen ==== | ||
+ | Makros mit Klammern haben mindestens einen Parameter. | ||
+ | Für die Parameter darf beim Aufruf beliebiger Text stehen. | ||
+ | Dieser Text wird sooft in die Zeichenfolge hineinkopiert, | ||
+ | wie der Makroparameter in der Zeichenfolge erscheint. | ||
+ | |||
+ | Syntax: | ||
+ | |||
+ | > ''# | ||
+ | <code cpp> | ||
+ | #define sqr(x) x*x | ||
+ | </ | ||
+ | Sobald ein definierter Makroname im Quelltext (außerhalb von Zeichenketten) | ||
+ | verwendet wird, wird er durch den Text des Makros ersetzt: | ||
+ | |||
+ | <code cpp> | ||
+ | double pi2 = sqr(PI); | ||
+ | </ | ||
+ | wird zu | ||
+ | <code cpp> | ||
+ | double pi2 = 3.1415926535*3.1415926535; | ||
+ | </ | ||
+ | ==== Gefahren ==== | ||
+ | Da es sich um reinen Textersatz handelt, | ||
+ | werden weder Typprüfungen vorgenommen | ||
+ | noch Operatorrangregeln beachtet. | ||
+ | Ungenügende Klammerung in der Makrozeichenfolge | ||
+ | führt zu unerwarteten Ergebnissen: | ||
+ | |||
+ | <code cpp> | ||
+ | int x2 = sqr(1+2); | ||
+ | </ | ||
+ | Konstantenvereinbarungen | ||
+ | und [[.: | ||
+ | ersetzen in C++ Makros in vielen Fällen. | ||
+ | Sie bieten ähnliche Funktionalität bei erhöhter Sicherheit. | ||
+ | |||
+ | ==== Makrodefinitionen löschen ==== | ||
+ | Makrodefinitionen lassen sich rückgängig machen. | ||
+ | Es ist kein Fehler, ''# | ||
+ | |||
+ | Syntax: | ||
+ | |||
+ | > ''# | ||
+ | <code cpp> | ||
+ | #undef PI | ||
+ | </ | ||
+ | ==== Vordefinierte Makros ==== | ||
+ | Einige Bezeichner sind beim Übersetzen stets vordefiniert | ||
+ | und dürfen nicht geändert oder gelöscht werden: | ||
+ | |||
+ | <code cpp> | ||
+ | __LINE__ | ||
+ | __FILE__ | ||
+ | __DATE__ | ||
+ | __TIME__ | ||
+ | </ | ||
+ | |||
+ | ===== Bedingte Übersetzung ===== | ||
+ | Mit ''# | ||
+ | ob die folgenden Quelltextzeilen übersetzt werden sollen. | ||
+ | ''# | ||
+ | ''# | ||
+ | Die Bedingung muss ein Ausdruck sein, | ||
+ | der bei der Übersetzung als 0 (falsch) oder | ||
+ | verschieden von 0 (wahr) ausgewertet wird. | ||
+ | |||
+ | Syntax: | ||
+ | |||
+ | > ''# | ||
+ | > ''# | ||
+ | > ''# | ||
+ | > ''# | ||
+ | <code cpp> | ||
+ | #if defined(unix) | ||
+ | // ... Unix-spezifischer Code | ||
+ | #else | ||
+ | // ... anderes Betriebssystem | ||
+ | #endif | ||
+ | </ | ||
+ | Die Schreibweisen | ||
+ | |||
+ | > ''# | ||
+ | > ''# | ||
+ | |||
+ | sind gleichbedeutend mit | ||
+ | |||
+ | > ''# | ||
+ | > ''# | ||
+ | |||
+ | [[.: | ||
+ | enthalten üblicherweise eine " | ||
+ | der mehrfaches Einbinden unschädlich macht. | ||
+ | |||
+ | <code cpp> | ||
+ | #ifndef EINDEUTIGER_BEZEICHNER | ||
+ | #define EINDEUTIGER_BEZEICHNER | ||
+ | // ... Deklarationen und Typdefinitionen | ||
+ | #endif | ||
+ | </ | ||
+ | |||
+ | ===== Fehlermeldungen ===== | ||
+ | Der Übersetzungsprozess lässt sich bei Bedarf mit einer Fehlermeldung stoppen | ||
+ | |||
+ | Syntax: | ||
+ | |||
+ | > ''# | ||
+ | <code cpp> | ||
+ | #error bis hierher und nicht weiter | ||
+ | </ | ||
+ | |||
+ | ===== Dateien einbinden ===== | ||
+ | Fast alle Programme müssen bestimmte | ||
+ | [[.: | ||
+ | einbinden. Zum Compiler-System gehörende | ||
+ | [[.: | ||
+ | eigene Vorspanndateien in doppelten Anführungszeichen eingeschlossen. | ||
+ | Die eigenen Vorspanndateien werden | ||
+ | in dem Verzeichnis (oder den Verzeichnissen) erwartet, | ||
+ | wo auch die anderen Quelltexte stehen; | ||
+ | dem Übersetzer können andernfalls entsprechende Suchpfade mitgeteilt werden. | ||
+ | Das Einbinden ist nicht auf Header beschränkt, | ||
+ | |||
+ | Syntax: | ||
+ | |||
+ | > ''# | ||
+ | <code cpp> | ||
+ | #include < | ||
+ | #include " | ||
+ | </ | ||
+ | Dateien dürfen sich nicht gegenseitig einbinden (''# | ||
kennen/cpp.txt · Zuletzt geändert: 2012-02-24 15:16 von 127.0.0.1