Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
18 Preprocessor<br />
Der Preprocessor ist theoretisch e<strong>in</strong> eigenständiges Programm, das vor dem eigentlichen Compiler<br />
gestartet wird. Heutzutage ist der Präprozessor oft <strong>in</strong> den Compiler <strong>in</strong>tegriert, aber das Pr<strong>in</strong>zip ist<br />
immer noch dasselbe, zuerst behandelt der Präprozessor das Programm, <strong>und</strong> erst anschliessend der<br />
Compiler. Der Präprozessor hat zwei Hauptaufgaben, nämlich alle Kommentare aus dem Code zu<br />
entfernen <strong>und</strong> alle Preprozessordirektiven (#-Befehle) ausführen. Er ist eigentlich nichts anderes als<br />
e<strong>in</strong> vielseitiges 'Suche <strong>und</strong> Ersetze Programm', er wird dabei mit den #-Befehlen gesteuert. Der Präprozessor<br />
führt alle Ersetzungen re<strong>in</strong> Textmässig aus, er versteht nichts von C.<br />
18.1 Die Präprozessorbefehle<br />
Die Präprozessorbefehle beg<strong>in</strong>nen mit e<strong>in</strong>em # <strong>und</strong> müssen am Anfang e<strong>in</strong>er Zeile, <strong>und</strong> alle<strong>in</strong>e <strong>in</strong><br />
e<strong>in</strong>er Zeile stehen. Wenn e<strong>in</strong> Befehl zu lang für e<strong>in</strong>e Zeile wird, kann er mit e<strong>in</strong>em \ am Zeilenende<br />
auf der nächsten Zeile fortgesetzt werden.<br />
Die wichtigsten Befehle:<br />
#<strong>in</strong>clude<br />
#<strong>in</strong>clude"Filename"<br />
#def<strong>in</strong>e Such Ersetz<br />
#<strong>und</strong>ef Such<br />
#def<strong>in</strong>e Square(x)<br />
((x)*(x))<br />
Fügt <strong>die</strong> angegebene Datei genau an <strong>die</strong>ser Stelle <strong>in</strong> den Code e<strong>in</strong>. Die Datei<br />
wird <strong>in</strong> den im Compilerverzeichnissen gesucht (Der Suchpfad kann bei den<br />
meisten Compilern irgendwo def<strong>in</strong>iert oder e<strong>in</strong>gestellt werden)<br />
Fügt <strong>die</strong> angegebene Datei genau an <strong>die</strong>ser Stelle <strong>in</strong> den Code e<strong>in</strong>. Die Datei<br />
wird zuerst im Verzeichnis der aktuellen Datei (Die mit dem Include-Befehl)<br />
gesucht, <strong>und</strong> falls sie dort nicht gef<strong>und</strong>en wird wie bei #<strong>in</strong>clude.<br />
Ersetzt ab hier jedes auftreten von Such durch Ersetz, Ersetz kann auch leer<br />
se<strong>in</strong>. (Genaugenommen wird das Makro Such def<strong>in</strong>iert)<br />
Löscht das Makro Such, ab hier werden ke<strong>in</strong>e Ersetzungen mehr vorgenommen.<br />
Def<strong>in</strong>iert e<strong>in</strong> Makro mit e<strong>in</strong>em Argument, beim Aufruf des Makros muss e<strong>in</strong><br />
Argument angegeben werden, welches dann <strong>in</strong> <strong>die</strong> Ersetzung e<strong>in</strong>fliesst.<br />
Achtung, der Präprozessor führt e<strong>in</strong>e re<strong>in</strong>e Textersetzung durch <strong>und</strong> ignoriert<br />
jegliche mathematischen Vorrangregeln -> Klammern setzen !!!:<br />
#def<strong>in</strong>e Square(x) x*x /* Problem, ohne Klammern */<br />
#x<br />
#def<strong>in</strong>e S(x) #x<br />
prefix##x<br />
#def<strong>in</strong>e T(x) p_##x<br />
#if<br />
#else<br />
#endif<br />
def<strong>in</strong>ed(Name)<br />
#ifdef Name<br />
#ifndef Name<br />
#pragma<br />
#error irgendwas<br />
q = Square(r+w);<br />
/* wird zu: q = r + w * r + w,<br />
was als q = r + (w * r) + w gerechnet wird */<br />
Makros können auch mehr als e<strong>in</strong> Argument besitzen.<br />
Str<strong>in</strong>gizer, nur <strong>in</strong>nerhalb Makros, Macht aus Makroargument e<strong>in</strong>en Str<strong>in</strong>g<br />
S(100) wird zu "100"<br />
Tokenizer, nur <strong>in</strong>nerhalb Makros, Macht aus Makroargument <strong>und</strong> Text neuen<br />
Token. T(DoIt) wird zu p_DoIt<br />
Bed<strong>in</strong>gte Compilierung. Wenn <strong>die</strong> Bed<strong>in</strong>gung nach #if wahr ist, wird der<br />
Code zwischen #if <strong>und</strong> #else normal behandelt, alles zwischen #else<br />
<strong>und</strong> #endif wie Kommentar. Wenn <strong>die</strong> Bed<strong>in</strong>gung falsch ist, entsprechend<br />
umgekehrt. Das #else kann auch weggelassen werden. Die Bed<strong>in</strong>gung nach<br />
#if muss aus konstanten Integerausdrücken bestehen (<strong>und</strong> def<strong>in</strong>ed()),<br />
<strong>und</strong> kann beliebige logische <strong>und</strong> arithmetische Verknüpfungen enthalten.<br />
Kann nach #if verwendet werden, liefert 1 wenn das genannte Makro exisiert,<br />
sonst 0.<br />
Kurzform für #if def<strong>in</strong>ed(Name)<br />
Kurzform für #if ! def<strong>in</strong>ed(Name)<br />
Mit <strong>die</strong>ser Zeile können herstellerabhängige Direktiven implementiert werden.<br />
Der Compiler ignoriert #pragma-Zeilen, <strong>die</strong> er nicht versteht.<br />
Gibt e<strong>in</strong>e Fehlermeldung aus<br />
Gedruckt am 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 66/147