16.09.2017 Aufrufe

Vorkurs Informatik

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

C.5 Übersetzungsprozess von C++-Programmen 351<br />

Die erste Anweisung #ifndef führt die Abfrage durch, ob eine sogenannte (symbolische) Konstante mit<br />

Namen STUDIERENDE_H nicht definiert ist – vom Prinzip liegt hier eine uns bereits bekannte if-Abfrage<br />

in einer negativierten Form vor. Falls die Bedingung erfüllt ist, die Konstante STUDIERENDE_H somit nicht<br />

definiert ist, erfolgt dies unter Verwendung des Präprozessor-Befehls #define in der nächsten Zeile, welcher<br />

zur Definition von (symbolischen) Konstanten dient. Abschließend wird mit der Bearbeitung der Headerdatei<br />

fortgesetzt. Sollte die Konstante STUDIERENDE_H bereits definiert sein, wodurch die #ifndef-<br />

Bedingung nicht erfüllt ist, wird vergleichbar zur if-Anweisung, mit der Bearbeitung nach der #endif-<br />

Anweisung fortgesetzt. In der Konsequenz erfolgt somit keine Bearbeitung der Headerdatei, wodurch auch<br />

eine mehrfache Bearbeitung durch den Compiler vermieden wird.<br />

Neben der Definition von (symbolischen) Konstanten im Zusammenhang mit der bedingten Kompilierung<br />

können über den Mechanismus der textuellen Ersetzung, mittels der #define-Anweisung, vom Prinzip<br />

auch Konstanten definiert werden. Beispielsweise würde in der Headerdatei über die Anweisung<br />

#define pi 3.14<br />

durchgehend die Buchstabenkombination pi, sofern davor und danach ein Leerzeichen vorliegt, durch 3.14<br />

ersetzt. Es sollte den Programmierenden daher immer bewusst sein, dass es sich um eine textuelle Ersetzung<br />

ohne semantische Überprüfung handelt.<br />

Im zweiten Übersetzungsschritt kommt der Compiler zur Anwendung. Dieser dient dazu die durch den<br />

Präprozessor vorverarbeiteten Quellcodedateien in maschinencodenahen Objektcode zu überführen. Da<br />

dieser vielfach noch sogenannte „offene Aufrufe“ enthält, kann er noch nicht ausgeführt werden. „Offene<br />

Aufrufe“ sind beispielsweise Verweise auf externe Bibliotheken, welche erst im letzten Schritt durch<br />

den Linker „geschlossen“ werden. Innerhalb der Verarbeitung durch den Compiler werden nachfolgende<br />

Teilaspekte auf Korrektheit überprüft:<br />

• Grammatik<br />

• Syntax<br />

• Logik.<br />

Unter grammatikalischer Validierung ist eine Überprüfung der Schreibweise entsprechender C++-Befehle<br />

zu verstehen. Syntaktische Fehler liegen vor, sofern Konventionen der Programmiersprache nicht eingehalten<br />

werden. Dies sind u. a. das korrekte Schließen von Klammern oder die richtige Anzahl an Parametern bei<br />

einem Aufruf. Eine eingeschränkte Überprüfung der Logik erfolgt für Datentypen, beispielsweise ob durch<br />

eine Typkonvertierung ein Informationsverlust resultieren kann. Gemäß der Ausprägung einer Abweichung<br />

von den sprachlichen Vorgaben kann der Compiler<br />

• Fehlermeldungen<br />

z. B. error C2065: ’h’: nichtdeklarierter Bezeichner<br />

• Warnungen<br />

z. B. warning C4244: ’Initialisierung’: Konvertierung von ’double’ in ’int’, möglicher<br />

Datenverlust<br />

ausgeben. Die Ausgabe des Objektcodes für die jeweilige Datei, gekennzeichnet durch die Endung „.obj“<br />

(Windows) oder „.o“ (Linux), erfolgt nur, sofern keine Fehler während der Bearbeitung festgestellt wurden.<br />

Warnungen führen hingegen nicht zum Abbruch der Bearbeitung.<br />

Im abschließenden Schritt setzt der Linker die verschiedenen Objektdateien zu einem vollständigen ausführbaren<br />

Programm zusammen. Angemerkt sei, dass es auch möglich ist Bibliotheken zu erstellen, welche<br />

nicht direkt ausführbar sind. Beim Linken werden auch die Objektdateien auf die im Schritt der Kompilierung<br />

noch vorhandenen „offenen Aufrufe“ überprüft.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!