21.11.2013 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!