namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


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 
 +[[.: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 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki