Der C-Präprozessor 08-CPräprozessor.

Slides:



Advertisements
Ähnliche Präsentationen
Programme in C++.
Advertisements

ALP II: Objektorientierte Programmierung Sommersemester 2006
1 Funktionstemplates Einbinden von Templates: –Eine *.o Datei, die durch Übersetzen einer Datei nur mit Templates erzeugt wurde, enthält keinen Programmcode.
Objektorientierte Programmierung
Ein- und Ausgabe von Dateien
Forschungszentrum caesar
Funktionen und Module Einführung anhand des Beispiels Wörter sortieren Timm Grams Fachhochschule Fulda Fachbereich Elektrotechnik und Informationstechnik.
Timm Grams Hochschule Fulda Fachbereich Elektrotechnik und Informationstechnik Rekursive Funktionen in C © Timm Grams, Fulda, (korr.: )
Hochschule Fulda – FB ET Sommersemester 2010
Einführung in die Programmierung Zusammenfassung
Kapitel 6. Suchverfahren
Synonyme: Stapel, Keller, LIFO-Liste usw.
Gliederung des Inhalts
Parser generieren Yet Another Compiler – Compiler YACC.
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
FH-Hof SQLJ Richard Göbel. FH-Hof SQLJ - Idee Erweiterung von Java um SQL Die Verwendung von SQL-Anweisungen innerhalb einer Programmiersprache wird vereinfacht.
SWITCH - Anweisung.
SWITCH - Anweisung.
FOR Anweisung.
Der Präprozessor. Bevor der Compiler das Programm in Maschinencode übersetzt (nur dieser kann von der CPU, dem Herz des Computers, bearbeitet werden)
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido
Zusammenfassung Vorwoche
Das erste Programm (Folie 16)
Einführung in C++ und das objektorientierte Programmieren (OOP)
Der C-Präprozessor EDV1 - 04Präprozessor.
Einführung in Visual C++
14StrukturKlasse1 Von der Struktur zur Klasse von C zu C++ Von Jens Hoffmann
Einführung in C EDV1 - 03C-Einführung.
DVG Einführung in Java1 Einführung in JAVA.
Einführung in C EDV1 - 04C-Einführung.
Planung einfache Dateibehandlung (externe Dateien, Öffnen, Lesen/Schreiben, Schließen). Diskussion des Problems, die Wörter in einem gegebenen Text.
Arbeiten mit Konstanten in Visual FoxPro 9.0 deutschsprachige FoxPro User Group Rainer Becker Microsoft Visual FoxPro 9.0 Roadshow CONST.
Einfach verkettete Listen
Informatik 1 Übung 2.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Die Zählschleife int s = 0 for (int k=1; k
Einführung in die Programmiersprache C 4
C-Einstieg. Agenda 1Vorbereitung 2Aufbau eines Programms 2.1Header 2.2 Methoden 2.3Main 3Datentypen & Variablen 4Operatoren(+, -, *, /) 5Logik 5.1IF 5.2Switch.
Programmierung 1. Einführung Seite 1
Purga - Scriptengine Ein Einblick.
Arrays / Felder Themen: Arrays / Felder / Vektoren Was soll das eigentlich? Erstellen von Arrays Arrays auslesen. Wie sie verwaltet werden.
Programmieren in C Grundlagen C 5
Starten der Entwicklungsumgebung (IDE)
Informatik Grundlagen, WS04, Seminar 7
Programmieren in C Grundlagen C 2
BMEVIEEA100 Grundlagen der Programmierung
Vorlesung 3. if else Anweisung if (Ausdruck) Anweisung1 else Anweisung2 Ausdruck hat einen von 0 verschiedenen Wert, so wird Anweisung 1 ausgeführt. Bei.
Programmieren in C Module und Bibliotheken Hochschule Fulda – FB AI Sommersemester Peter Klingebiel, HS Fulda, DVZ.
Programmiervorkurs WS 2014/15 Schleifen
early binding (frühe Bindung) late binding (späte Bindung)
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
1 // Laengste Zeile bestimmen // // Liest die Eingabe Zeichen fuer Zeichen, bis // das erscheint. // Die laengste Zeile wird ausgegeben (bei.
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Einführung in die Programmiersprache C 2
Extended Pascal Erweiterung von Pascal shadi Behzadipour shadi Shadi behzadipour.
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Fallunterscheidung und Iteration Programmierung I Prof. Dr. Michael Löwe.
Verzweigung oder bedingte Anweisung. Aufgabe: Ein Autofahrer tankt sein Auto voll und schreibt den Kilometerstand auf (drei- stelliger Tageszähler).Wenn.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Namensräume (namespaces). verwendet man umfangreiche eigene und fremde Bibliotheken (Sammlungen von Funktionen) so ist die Wahrscheinlichkeit groß, daß.
Analyse des HTML-Codes. Dieser Code ist für die Breite des Textes.
1 // Verkettete Liste 2 // demonstriert verkettete Listen und // Rekursion // (Einfügen am "Fuß") // #include struct Liste { int Element; Liste *weiter;
Inhalte der Übungen 1.Grundlagen, Ein- und Ausgabe 2.Kontrollstrukturen (Projekt 1) 3.Funktionen 4.Zeiger, Felder (Projekt 2) 5.Strings, Strukturen 6.Fileverarbeitung.
Java-Kurs - 2. Übung primitive Datentypen, Konstanten
Seminar Programmierstil: Codierungsstandards
Schleifen mit der Turtle
 Präsentation transkript:

Der C-Präprozessor 08-CPräprozessor

Der C-Präprozessor Bevor ein Programm vom eigentlichen C-Compiler bearbeitet wird, wird es vom C-Präprozessor bearbeitet. Dabei werden reine Textersetzungen durchgeführt. Der Präprozessor erzeugt den vom Compiler zu übersetzenden Quelltext. Compiler C-Quelltext mit Präprozessor- anweisungen C-Quelltext ohne Präprozessor- anweisungen Objektmodule Präprozessor Verbinder Ausführbares Programm Bibliotheken 08-CPräprozessor

Die Präprozessoranweisungen Anweisungen für den Präprozessor beginnen immer mit # in der ersten Spalte. Es gibt folgende Präprozessoranweisungen: #include : Einfügen einer Datei #define : Definieren einer Konstanten oder eines Makros #if (#ifdef, #ifndef) - #elif - #else – #endif : bedingte Übersetzung 08-CPräprozessor

Die include-Anweisung Die include-Anweisung fügt eine Datei in den Quelltext ein. Es ist genau so als ob der Inhalt der eingefügten Datei statt der include-Anweisung steht. Datei „limits.h“ enthält: char min_char=-128; char max_char=127; Datei „prog.c“ enthält: #include "limits.h" int main() { char c; for (c=min_char;c<max_char;c++) printf("char[%i]=%c\n",c,c); } 08-CPräprozessor

for (c=min_char;c<max_char;c++) printf("char[%i]=%c\n",c,c); } Compileraufruf: gcc –ansi prog.c –E –o prog.i erzeugt die Datei „prog.i“ # 1 "prog.c" # 1 "limits.h" 1 char min_char=-128; char max_char=127; # 1 "prog.c" 2 int main() { char c; for (c=min_char;c<max_char;c++) printf("char[%i]=%c\n",c,c); } 08-CPräprozessor

Zwei Formen der include-Anweisung #include <filename> sucht die Datei im Standarbibliothekspfad #include "filename" sucht die Datei im aktuellen Verzeichnis Z.B.: #include <stdio.h> #include "limits.h" Anwendungen der include-Anweisung: Einfügen von „header“-Dateien, die die Schnittstellendefinition von Prozeduren enthalten Einfügen von Definitionen von Konstanten und Typen 08-CPräprozessor

Die define - Anweisung Mit der define-Anweisung werden Konstanten und Macros definiert. Allgemeine Form: #define <NAME> <ZEICHENKETTE> Nach dieser define-Anweisung wird jedes Auftreten von <NAME> als ganzes Wort im Text durch <ZEICHENKETTE> ersetzt. 08-CPräprozessor

Beispiel limits.h #define MIN_CHAR –128 #define MAX_CHAR 127 prog.c #include "limits.h" int main() { char c; for (c=MIN_CHAR;c<MAX_CHAR;c++) printf("char[%i]=%c\n",c,c); printf("char[%i]=%c\n",c,c); } 08-CPräprozessor

printf("char[%i]=%c\n",c,c); } # 1 "prog.c" # 1 "limits.h" 1 # 1 "prog.c" 2 int main() { char c; for (c= -128 ;c< 127 ;c++) printf("char[%i]=%c\n",c,c); } 08-CPräprozessor

Zusammen mit der include-Anweisung kann damit ein Programm sehr flexible geschrieben und dann durch geringe Änderungen an die Hardware angepasst werden. Beispiel: #define TEXT1 "Das ist ein ganz langer Text." #define TEXT2 "Das ist noch ein langer Text." #define TEXT3 "Das ist der dritte lange Text." printf(" %s\n %s\n %s\n",TEXT1,TEXT2,TEXT3); define-Anweisung wird genutzt, um Programme übersichtlicher zu gestalten und bestimmte möglicherweise öfter zu ändernde Programmteile an einer Stelle zu konzentrieren. define-Anweisungen können ersetzt werden durch die Angabe des D-Schalters beim Compilerauffruf. Z.B: gcc –DTRUE=1 hello.c bewirkt die Einfügung der Anweisung #define TRUE 1 vor das Programm hello.c. 08-CPräprozessor

Macros Macros dienen der parametrisierten Ersetzung von Zeichenketten durch Ausdrücke. Beispiel: #define MAX(A,B) (((A)>(B))?(A):(B)) float a,b,c; c=MAX(a+b,a-b); wirkt wie c=(((a+b)>(a-b))?(a+b):(a-b)); Achtung! Immer ausreichend Klammern gebrauchen! Trennzeichen in der define-Anweisung trennen den zu definierenden Namen von der Definition, solange sie nicht in Klammern eingeschlossen sind.  #define MAX(A,B) (((A)>(B))?(A):(B)) #define MAX( A,B) (((A)>(B))?(A):(B)) #define MAX (A,B) (((A)>(B))?(A):(B)) sind zulässig haben aber z.T. unterschiedliche Bedeutung 08-CPräprozessor

#define MAX(A,B) (((A)>(B))?(A):(B)) #define MIN(A,B) (((A)<(B))?(A):(B)) int main() { int i,j; int max=MAX(i,j); int min=MIN(i,j); int m=MAX(i-j,j-i)*MIN(i-j,j-i); } 08-CPräprozessor

int max= ((( i )>( j ))?( i ):( j )) ; # 1 "prog.c" int main() { int i,j; int max= ((( i )>( j ))?( i ):( j )) ; int min= ((( i )<( j ))?( i ):( j )) ; int m= ((( i-j )>( j-i ))?( i-j ):( j-i )) * ((( i-j )<( j-i ))?( i-j ):( j-i )) ; } 08-CPräprozessor

Spezielle Operatoren in Macros #<NAME> bewirkt, dass der Wert nach dem Ersetzen in "-" gesetzt wird. <NAME1>##<NAME2> bewirkt die direkte Verkettung der Werte von <NAME1> und <NAME2>. 08-CPräprozessor

#define PRINT(X) printf("Wert von %s = %i\n",#X,X) #define INIT(A,B) A##B=(A)*100+(B) int main() { int c=20; int j=0; int INIT(c,j); PRINT(c); PRINT(j); PRINT(cj); } 08-CPräprozessor

printf("Wert von %s = %i\n","c", c ) ; # 1 "oper.c" int main() { int c=20; int j=0; int cj =( c )*100+( j ) ; printf("Wert von %s = %i\n","c", c ) ; printf("Wert von %s = %i\n","j", j ) ; printf("Wert von %s = %i\n","cj", cj ) ; } 08-CPräprozessor

Vordefinierte Macros - GNUC __LINE__ __FILE__ __DATE__ __TIME__ Weitere von Compilern abhängige Macros: __STRICT_ANSI__ 1 _LANGUAGE_C 1 __GNUC__ 2 __GNUC_MINOR__ 7 __unix__ 1 08-CPräprozessor

Beispiel int main () { printf("Filename : %s\n",__FILE__); printf("Date : %s\n",__DATE__); printf("Time : %s\n",__TIME__); printf("LineNr. : %i\n",__LINE__); } # 1 "vordef.c" int main () { printf("Filename : %s\n","vordef.c"); printf("Date : %s\n","May 1 2000"); printf("Time : %s\n","09:51:49"); printf("LineNr. : %i\n",6); } 08-CPräprozessor

Macros als Compiler-Schalter Durch Angabe des Compilerschalters "-D" können Macros nachträglich definiert werden. Z.B.: cc hello.c –Dname1 –Dname2=wert entspricht der Einfügung von #define name1 #define name2 wert am Anfang des Quelltextes hello.c Wird häufig benutzt um spezielle Versionen aus einer Quelle zu erzeugen, z.B.: Hardwareabhängigkeit Genauigkeitsversionen (float, double) Größenversionen Unterschiedliche Interface (X11, Windows) 08-CPräprozessor

Bedingte Übersetzung #if (#ifdef, #ifndef) - #elif - #else – #endif Mit Hilfe der Anweisungen zur bedingten Übersetzung können bestimmte Teile des C-Programmes zur Übersetzung ausgewählt bzw. von der Übersetzung ausgenommen werden. Allgemeine Form: #if AUSDRUCK1 text1 #elif AUSDRUCK2 text2 #elif AUSDRUCK3 text3 #else text4 #endif Es sind nur einfache logische Ausdrücke mit numerischen Werten erlaubt. FALSE==0, TRUE != 0. 08-CPräprozessor

Statt #if AUSDRUCK kann auch #ifdef MACRO bzw. #ifndef MACRO stehen Statt #if AUSDRUCK kann auch #ifdef MACRO bzw. #ifndef MACRO stehen. In diesen wird geprüft ob das Macro definiert bzw. nicht definiert ist. 08-CPräprozessor

Beispiel int main () { #if BETA && DEMO printf( "Beta-Version %i\n%i - Tage Demo\n",BETA,DEMO); #elif BETA "Beta-Version %i\nunbegrenzte Lizenz\n",BETA); #elif DEMO printf("Final Release\n%i - Tage Demo\n",DEMO); #else printf("Final Release\nunbegrenzte Lizenz\n"); #endif } 08-CPräprozessor

gcc –ansi bed. c –DBETA=2 –DDEMO=30 –E –o bed. i int main () { gcc –ansi bed.c –DBETA=2 –DDEMO=30 –E –o bed.i int main () { printf("Beta-Version %i\n%i - Tage Demo\n",2 ,30 ); } gcc –ansi bed.c –DBETA=0 –DDEMO=30 –E –o bed.i int main () { printf("Final Release\n%i - Tage Demo\n",30 ); } gcc –ansi bed.c –DBETA=2 –DDEMO=0 –E –o bed.i int main () { printf("Beta-Version %i\nunbegrenzte Lizenz\n",2 ); } gcc –ansi bed.c –DBETA=0 –DDEMO=0 –E –o bed.i int main () { printf("Final Release\nunbegrenzte Lizenz\n"); } 08-CPräprozessor

Typisches Header-File stdio.h #ifndef _INC_STDIO #define _INC_STDIO ... #endif /* _INC_STDIO */ 08-CPräprozessor