namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:cpp

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

kennen:cpp [2012-02-24 15:16] (aktuell)
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 
 +[[.:​module#​Übersetzungsprozess]] ​
 +vorgeschaltetes Programm.
 +Er ersetzt [[#​Makros]],​
 +sorgt für [[#bedingte Übersetzung]]
 +und kann [[#Dateien einbinden]].
 +Er wird von Zeilen gesteuert, ​
 +die mit dem Doppelkreuz ''#''​ beginnen.
 +Die Syntax dieser Zeilen hat mit C++ nur sehr wenig zu tun.
 +
 +===== Textersatz =====
 +==== Makros ====
 +Makros sind benannte "​Textbausteine"​.
 +
 +Syntax:
 +
 +>  ''#​define''​ Bezeichner Zeichenfolge
 +<code cpp>
 +#define MfG "Mit freundlichem Gruss"
 +#define PI 3.1415926535
 +</​code>​
 +
 +==== 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:
 +
 +>  ''#​define''​ Bezeichner''​(''​ Bezeichnerliste ''​)''​ Zeichenfolge
 +<code cpp>
 +#define sqr(x) x*x
 +</​code>​
 +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); ​  
 +</​code>​
 +wird zu
 +<code cpp>
 +double pi2 = 3.1415926535*3.1415926535; ​  
 +</​code>​
 +==== 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); ​ // 1+2*1+2 = 5 statt 9 
 +</​code>​
 +Konstantenvereinbarungen ​
 +und [[.:​keywords#​inline]]-Funktionen
 +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, ''#​undef''​ auf einen unbekannten Namen anzuwenden.
 +
 +Syntax:
 +
 +>  ''#​undef''​ Bezeichner
 +<code cpp>
 +#undef PI
 +</​code>​
 +==== 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__
 +</​code>​
 +
 +===== Bedingte Übersetzung =====
 +Mit ''#​if''​ lässt sich steuern, ​
 +ob die folgenden Quelltextzeilen übersetzt werden sollen.
 +''#​elif''​ (else if)- und ''#​else''​-Anweisungen sind optional,
 +''#​endif''​ muss immer am Schluss stehen.
 +Die Bedingung muss ein Ausdruck sein, 
 +der bei der Übersetzung als 0 (falsch) oder 
 +verschieden von 0 (wahr) ausgewertet wird.
 +
 +Syntax:
 +
 +>  ''#​if''​ Bedingung
 +>  ''#​elif''​ Bedingung
 +>  ''#​else''​
 +>  ''#​endif''​
 +<code cpp>
 +#if defined(unix)
 +  // ... Unix-spezifischer Code
 +#else
 +  // ... anderes Betriebssystem
 +#endif
 +</​code>​
 +Die Schreibweisen
 +
 +>  ''#​ifdef''​ Bezeichner
 +>  ''#​ifndef''​ Bezeichner
 +
 +sind gleichbedeutend mit
 +
 +>  ''#​if defined(''​ Bezeichner ''​)''​
 +>  ''#​if !defined(''​ Bezeichner ''​)''​
 +
 +[[.:​module#​Header|Headerdateien]]
 +enthalten üblicherweise eine "​Include-Wächter",​
 +der mehrfaches Einbinden unschädlich macht.
 +
 +<code cpp>
 +#ifndef EINDEUTIGER_BEZEICHNER
 +#define EINDEUTIGER_BEZEICHNER
 +  // ... Deklarationen und Typdefinitionen
 +#endif
 +</​code>​
 +
 +===== Fehlermeldungen =====
 +Der Übersetzungsprozess lässt sich bei Bedarf mit einer Fehlermeldung stoppen
 +
 +Syntax:
 +
 +>  ''#​error''​ Fehlermeldung
 +<code cpp>
 +#error bis hierher und nicht weiter
 +</​code>​
 +
 +===== Dateien einbinden =====
 +Fast alle Programme müssen bestimmte
 +[[.:​module#​Header|Headerdateien]]
 +einbinden. Zum Compiler-System gehörende ​
 +[[.:​header|Standard-Headernamen]] werden in spitze Klammern,
 +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,​ jedoch der häufigste Einsatzfall.
 +
 +Syntax:
 +
 +>  ''#​include''​ Datei
 +<code cpp>
 +#include <​iostream>​
 +#include "​meinedatei.h"​
 +</​code>​
 +Dateien dürfen sich nicht gegenseitig einbinden (''#​include''​-Rekursion).
  
kennen/cpp.txt · Zuletzt geändert: 2012-02-24 15:16 (Externe Bearbeitung)