Der C-Präprozessor EDV1 - 04Präprozessor.

Slides:



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

Blue J.
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
Hochschule Fulda – FB ET Sommersemester 2010
Agenda Sitzung 2 für den Programmaufbau
Kapitel 6. Suchverfahren
Synonyme: Stapel, Keller, LIFO-Liste usw.
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Paul, Morten, Yannick Blue J. Entwicklungsumgebung versteht Java Programmcode versteht Java Programmcode Für die Entwicklung eigener Software.
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.
ARRAY oder FELD oder VEKTOR
V AdresseWert public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher.
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.
DO...WHILE Anweisung.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 2 Gisbert Dittrich; Claudio Moraga FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Zusammenfassung Vorwoche
Das erste Programm (Folie 16)
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.
Portierung von Java nach C
DVG Einführung in Java1 Einführung in JAVA.
Der C-Präprozessor 08-CPräprozessor.
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
Einführung in die Programmierung
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
Informatik 1 Übung 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
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
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.
Vorlesung 5. #include double fv(double x) { return sin(x); } int main(){ int i,N=10; double a=1,b=2,del,x,sum,f,integral; for(i=1,sum=0.0,del = (b-a)/N;i
Programmieren in C Module und Bibliotheken Hochschule Fulda – FB AI Sommersemester Peter Klingebiel, HS Fulda, DVZ.
Paul, Morten, Yannick Blue J. Entwicklungsumgebung  versteht Java Programmcode  Für die Entwicklung eigener Software  Durch die Programmierung.
early binding (frühe Bindung) late binding (späte Bindung)
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 5.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
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.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
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
Schleifen mit der Turtle
 Präsentation transkript:

Der C-Präprozessor EDV1 - 04Prä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 EDV1 - 04Präprozessor Verbinder Ausführbares Programm Bibliotheken

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 EDV1 - 04Prä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); } EDV1 - 04Prä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); } EDV1 - 04Prä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 EDV1 - 04Prä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. EDV1 - 04Prä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); } EDV1 - 04Prä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); } EDV1 - 04Prä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. EDV1 - 04Prä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 EDV1 - 04Präprozessor

Beispiel #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); } EDV1 - 04Prä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 )) ; } EDV1 - 04Prä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>. EDV1 - 04Präprozessor

Beispiel #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); } EDV1 - 04Prä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 ) ; } EDV1 - 04Prä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 EDV1 - 04Präprozessor

Beispiel int main () { printf("Filename : %s\n",__FILE__); printf("Date : %s\n",__DATE__); printf("Time : %s\n",__TIME__); printf("LineNr. : %i\n",__LINE__); } EDV1 - 04Präprozessor # 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); }

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) EDV1 - 04Prä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. EDV1 - 04Prä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. EDV1 - 04Prä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 } EDV1 - 04Prä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"); } EDV1 - 04Präprozessor

Typisches Header-File stdio.h #ifndef _INC_STDIO #define _INC_STDIO ... #endif /* _INC_STDIO */ EDV1 - 04Präprozessor