FACHHOCHSCHULE MANNHEIM

Ähnliche Dokumente
C - PRÄPROZESSOR. Seminar effiziente C Programmierung WS 2012/13. Von Christian Peter

Programmierung mit C Modularisierung von Programmen. Präprozessor-Anweisungen nutzen.

C/C++ Programmierung

Programmiersprachen Einführung in C

8.1 Vom Quellcode zur ausführbaren Programm

Compiler Präprozessor Header Files

Beispiel. Problem: mehrteilige Nachnamen (von Goethe, Mac Donald, Di Caprio)

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Einführung Makros Includes Errors und Warnings Pragmas Diverses. Der C-Präprozessor. Lukas Stabe. Universität Hamburg

Propädeutikum. Dipl.-Inf. Frank Güttler

C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

Vorlesung Informatik I

Der C-Präprozessor. Lukas Stabe

C- Kurs 06 Übersetzung & Module

Übung zu Grundlagen der Betriebssysteme. Einführungsveranstaltung

Vorlesung Informatik I

Java Übung. Übung 2. Werner Gaulke. 19. April Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung.

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Arithmetik in der tcsh

Objektorientierung: Klassen und Objekte

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15

Einheit Lexikalische Grundlagen der Programmiersprache C Lexikalische Einheiten

Technisches Programmieren in C++

Compiler und Präprozessor (1) Erstellen eines Projektes

Der C Präprozessor. Inhaltsverzeichnis. von Christian Peter 31. März Denition 3. 2 Funktionsweisen 3

Kompilieren Datentypen Operatoren. Überblick. 1 Kompilieren. 2 Datentypen. const static volatile. 3 Operatoren. Alexander Batoulis

Algorithmus: Kochrezept

2. Programmierung in C

Berichte aus der Informatik. Dieter Pawelczak. Start in die C-Programmierung

Übungs- und Praktikumsaufgaben zur Systemprogrammierung Dipl.-Ing. H. Büchter (Lehrbeauftragter) FH-Dortmund WS 2001/2002 / SS 2002

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Einstieg in die Informatik mit Java

Einführung in C. EDV1-04C-Einführung 1

C für Java-Programmierer

javascript Coding-Guidelines 2. Ausgabe Februar 2015 Der Guideline beschreibt den verwendeten Coding-Stil von javascript als eigene Richtline.

Deklarationen in C. Prof. Dr. Margarita Esponda

Präprozessor und make. einfache Makros Makros nehmen eine Textersetzung vor. Erst nach der Ersetzung muss gültiger C-Code vorliegen.

Einstieg in die Informatik mit Java

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

7. Einführung in C++ Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

Name: Klausur Informatik III WS 2003/04

Funktionen in Matlab. Nutzerdefinierte Funktionen können in.m-datei gespeichert werden

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

einlesen n > 0? Ausgabe Negative Zahl

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Allgemeines. Verschiedene Sprachkonzepte C-Sprachfamilie C-ähnliche Programmiersprachen Allgemeines zu C. #include <stdio.h>

Tag 4 Repetitorium Informatik (Java)

Grundlagen der Informatik Vorlesungsskript

Einstieg in die Informatik mit Java

Propädeutikum. Dipl.-Inf. Frank Güttler

Inhaltsverzeichnis. Kapitel i: Schnelleinstieg 13. Kapitel 2: Was sind Programme? 17. Kapitel 3: Wie erstellt man eigene Programme?

Einstieg in die Informatik mit Java

Praxisorientierte Einführung in C++ Lektion: "Die Compiler-Chain (Vom Quellcode zum ausführbaren Programm)"

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C

Klassenvariablen, Klassenmethoden

S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"

Java I Vorlesung Imperatives Programmieren

Syntax der Sprache PASCAL

Programmierung und Angewandte Mathematik

C-Programmierung lernen

Programmierkonventionen - 1 -

Die Programmiersprache C

Übersicht. C Modularisierung. Präprozessor, Compiler, Linker. Präprozessor, Compiler, Linker. Präprozessor, Compiler und und Linker Linker

Brückenkurs Programmieren

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 4

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

L4. Erster Schritt zum Programmieren

Embedded Software. Der C Präprozessor. Sichere objektbasierte Entwicklung dank C Präprozessor. Prof. Dr. Nikolaus Wulff

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Linux und Shell-Programmierung Teil 5

Shell-Scripting Linux-Kurs der Unix-AG

Datentypen: integer, char, string, boolean

Shell-Scripting Linux-Kurs der Unix-AG

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 1

1. Vom Sourcecode zum Programm

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Kapitel 2. Einfache Beispielprogramme

Grundlagen der Programmierung in C Funktionen

ATM18-Projekt Arbeiten mit CodeVisionAVR C-Compiler Teil 04 - Der Preprozessor

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Java Einführung Methoden. Kapitel 6

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

Transkript:

für Java-Programmierer Der Präprozessor Prof. Dr. Wolfgang Schramm FACHHOCHSCHULE MANNHEIM Hochschule für Technik und Gestaltung

Präprozessor Ist dem Compiler vorgeschaltet ( Prä -). Spezielle Anweisungen im Quelltext, die sog. Präprozessoranweisungen werden vom Präprozessor erkannt und verarbeitet. Der Präprozessor verändert den Quelltext, bevor er vom Compiler übersetzt wird. Vorteile von Präprozessor-Anweisungen Die Präprozessoranweisungen dienen i.w. dazu das Quellprogramm kompakter und damit übersichtlicher zu gestalten Bessere Lesbarkeit Bessere Portierbarkeit von Programmen; geschicktes Verstecken von maschinen-abhängigen Details durch Präprozessor-Anweisungen Folie 2

Präprozessor-Anweisungen allgemeine Syntax i.d.r. # in der ersten Spalte unmittelbar nach #: gewünschte Präprozessor-Anweisung, Leerzeichen sind nicht zulässig darf i.d.r. nicht über mehrere Zeilen hinausgehen, muss in der Zeile, in der sie begonnen wurde, beendet werden sind mehrzeilige Präprozessor-Anweisungen erforderlich: \ als letztes Zeichen in der Zeile Folie 3

Arten von Präprozessor-Anweisungen Kopieren von externen Dateien in die zu übersetzende Datei (#include) Textuelles Ersetzen von symbolischen Konstanten und Makros durch zuvor definierte Werte (#define) Bedingte Übersetzung (#ifdef ) Folie 4

Präprozessor-Anweisungen: Einbinden von Dateien Syntax: #include <dateiname> oder #include "dateiname" Datei wird in speziellem Verzeichnis gesucht: Standardinclude-Verzeichnis Datei wird in aktuellem Verzeichnis gesucht Semantik: An der Stelle, an der die include-anweisung steht, wird die angegebene externe Datei in die zu übersetzende Datei kopiert. Verwendung: Informationen, die für mehrere Programme von Interesse sind an zentraler Stelle verfügbar machen. wichtigste Anwendung: Einbindung von Standard-Headerdateien (Nutzung der mitgelieferten Laufzeitbiliotheken). Folie 5

Präprozessor-Anweisungen: Einbinden von Dateien - Beispiel Quelldatei: Zeile 1 #include "b.h" Zeile 2 #include "c.h" Zeile 3 Datei b.h: Zeile b1 Zeile b2 Datei c.h: Zeile c1 Zeile c2 Zeile 1 Zeile b1 Zeile b2 Zeile 2 Zeile c1 Zeile c2 Zeile 3 Eingabe für Compiler nach Präprozessorlauf Folie 6

Präprozessor-Anweisungen: Konstantendefinition Einfachste Form der #define-anweisung. Beispiele: #define EINS 1 Alle Vorkommen von EINS im Bezeichnerkontext eines Programms werden durch 1 ersetzt. #define forever for (;;) /* Endlosschleife */ vernünftige Konstanten: #define TRUE 1 #define FALSE 0 #define PI 3.1415926535 #define AND && #define OR #define NOT! Folie 7

kompliziertes Beispiel: #define IF if ( #define THEN ) { #define ELSE ; } else { #define END ; } IF 5 <= 10 THEN printf ("5 kleiner gleich 10") ELSE printf ("5 größer 10") END Quellprogramm if ( 5 <= 10 ) { printf ("5 kleiner gleich 10") ; } else { printf ("5 größer 10") ; } Vom Compiler modifiziertes Quellprogramm Folie 8

Präprozessor-Anweisungen: Makrodefinition Syntax: #define name [ "(" Parameterliste ")" ] [ Wert ] Semantik: Man gibt Zeichenketten an, die vor der Übersetzung des Programms in andere Zeichenketten (aus-)getauscht werden sollen. textuelle Ersetzung Begriffe: #define #undef späteres Austauschen definierte Zeichenkette Darf an jeder beliebigen Stelle im Programm erfolgen. Sichtbarkeit ab Definitionsende bis Dateiende. Makrodefinition Makrodefinition (ab diesem Punkt) außer Kraft setzen Makrosubstitution Makro Folie 9

Präprozessor-Anweisungen: Makros #define KLEINER_NULL(a) a < 0 if (KLEINER_NULL(i) KLEINER_NULL(x)) if ( i < 0 x < 0) #define SCHALTJAHR(a)\ (a)%4 == 0 && (a)%100!=0 (a)%400 ==0 if (SCHALTJAHR(2001))... if (SCHALTJAHR(2002))... if (SCHALTJAHR(2003))... if (SCHALTJAHR(2004))... if (SCHALTJAHR(2001+x))... Wichtig: Klammerung des Parameters (2001+x)%4 == 0 && (2001+x)%100!=0 (2001+x)%400 == 0 2001+(x %4) == 0 && 2001+(x % 100)!=0 2001+(x %400) == Folie 10

Makros vs. Funktionen Argumente von Makros können beliebige Datentypenannehmen. Es ist sogar möglich, dass Makros lokale Variablen vereinbaren können. Makros sind effizienter (vermeiden Laufzeit-Overhead). Der Quelltext wird umfangreicher, da jeder Makroaufruf eine textuelle Expansion bedingt. Rekursion ist nicht möglich. Komplizierte Makros fehleranfällig. I.d.R. sollten Makros für sehr kurze Funktionen eingesetzt werden. Folie 11

Bedingte Übersetzung 1/4 Problem in der Praxis: Ein Programm wird für verschiedene Plattformen (Software, Hardware z.b. das zugrundeliegende Betriebssystem ist entweder Unix oder Windows) mit plattformabhängigen (man sagt auch maschinenabhängigen) Programmteilen entwickelt. Man möchte trotzdem 2 Versionen des Quelltextes vermeiden, da sonst die Gefahr besteht, dass bei Änderungen nicht synchron verfahren wird. Bedingte Übersetzung - Hierbei werden bestimmte Teile des Quellcode mittels Präprozessordirektiven von der Compilation ausgeschlossen. - Benötigte Direktiven: - ifdef - ifndef - elif - else - endif Folie 12

Bedingte Übersetzung 2/4 Syntax: #ifdef Bezeichner 1 Programmtext 1 [#elif Bezeichner 2 Programmtext 2 ].... [#elif Bezeichner n Programmtext n ] [#else Programmtext n+1 ] #endif Semantik: Falls Bezeichner 1 vorher mit der define-direktive definiert wurde, wird Programmtext 1 in die Übersetzung einbezogen. Ist das nicht der Fall, wurde aber Bezeichner 2 vorher mit der define-direktive definiert, wird Programmtext 2 in die Übersetzung einbezogen etc. Ist keiner der Bezeichner definiert, wird Programmtext n+1 in die Übersetzung einbezogen. Folie 13

Bedingte Übersetzung 3/4 #define UNIX /* nur an dieser Stelle muss geändert werden */ #ifdef W2K Programmtext 1 mit Windows2000 spezifischen Anweisungen #elif UNIX Programmtext 2 mit Unix spezifischen Anweisungen #endif Folie 14

Bedingte Übersetzung 4/4 Problem in der Praxis: Beim Testen streut man eigene Debug-Anweisungen in den Programmtext ein (print Anweisungen). Diese nur zum Testen des Programm notwendigen Ausgabeanweisungen kann man mittels der ifdef-direktive ein- bzw. ausschalten (dann wenn das Programm in Produktion geht). #define DEBUG /* nur an dieser Stelle muss geändert werden */ #ifdef DEBUG printf (.); printf (.); #endif Folie 15

#-Operator (stringizing operator) Dem Parameter kann im Makroersatztext der #-Operator vorangestellt werden. Beim Aufruf wird das entsprechende Argument in Anführungszeichen ( ) gesetzt, also in einen String konvertiert. #define printint(i) printf( Wert #i = %d, i) int a, b;... printint (a-b); printf( Wert a-b = %d, a-b); printf( Wert a-b = %d, a-b); Folie 16

##-Operator (token past operator) Dem Parameter kann im Makroersatztext der ##-Operator vor- oder nachgestellt werden. Beim Aufruf zieht der Präprozessor die Zeichenfolgen links und rechts vom ##-Operator zusammen. Leerzeichen werden ignoriert. Entsteht dabei wieder ein Makro-Aufruf, dann wird auch dieses Makro expandiert. #define show(var, nr) printf(#var #nr =%.1f\n, var ## nr) float x5 = 16.4;... show (x,5); printf( x 5 =%.1f\n, x5); Ausgabe: x5 = 16.4 Folie 17