Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

08-CPräprozessor 1 Der C-Präprozessor. 208-CPräprozessor Der C-Präprozessor Bevor ein Programm vom eigentlichen C-Compiler bearbeitet wird, wird es vom.

Ähnliche Präsentationen


Präsentation zum Thema: "08-CPräprozessor 1 Der C-Präprozessor. 208-CPräprozessor Der C-Präprozessor Bevor ein Programm vom eigentlichen C-Compiler bearbeitet wird, wird es vom."—  Präsentation transkript:

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

2 208-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. 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. C-Quelltext mit Präprozessor- anweisungen C-Quelltext ohne Präprozessor- anweisungen Objektmodule Ausführbares Programm Bibliotheken PräprozessorCompiler Verbinder

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

4 408-CPräprozessor Die include -Anweisung Die include-Anweisung fügt eine Datei in den Quelltext ein. 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. 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

5 508-CPräprozessor Compileraufruf: gcc –ansi prog.c –E –o prog.i erzeugt die Datei prog.i 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

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

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

8 808-CPräprozessorBeispiel limits.h #define MIN_CHAR –128 #define MAX_CHAR 127 limits.h #define MIN_CHAR –128 #define MAX_CHAR 127 prog.c #include "limits.h" int main() { char c; for (c=MIN_CHAR;c

9 908-CPräprozessor # 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);printf("char[%i]=%c\n",c,c);}

10 1008-CPräprozessor Zusammen mit der include -Anweisung kann damit ein Programm sehr flexible geschrieben und dann durch geringe Änderungen an die Hardware angepasst werden. 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); 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- 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. 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.

11 1108-CPräprozessorMacros Macros dienen der parametrisierten Ersetzung von Zeichenketten durch Ausdrücke. 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)); 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! Achtung! Immer ausreichend Klammern gebrauchen! 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 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

12 1208-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); }

13 1308-CPräprozessor # 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 )) * ((( i-j )<( j-i ))?( i-j ):( j-i )) ;}

14 1408-CPräprozessor Spezielle Operatoren in Macros # bewirkt, dass der Wert nach dem Ersetzen in "-" gesetzt wird. # bewirkt, dass der Wert nach dem Ersetzen in "-" gesetzt wird. ## bewirkt die direkte Verkettung der Werte von und. ## bewirkt die direkte Verkettung der Werte von und.

15 1508-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);}

16 1608-CPräprozessor # 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 ) ; }

18 1808-CPräprozessorBeispiel 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 "); printf("Time : %s\n","09:51:49"); printf("LineNr. : %i\n",6); }

19 1908-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 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.: Wird häufig benutzt um spezielle Versionen aus einer Quelle zu erzeugen, z.B.: Hardwareabhängigkeit Hardwareabhängigkeit Genauigkeitsversionen (float, double) Genauigkeitsversionen (float, double) Größenversionen Größenversionen Unterschiedliche Interface (X11, Windows) Unterschiedliche Interface (X11, Windows)

20 2008-CPräprozessor Bedingte Übersetzung #if (#ifdef, #ifndef ) - #elif - #else – #endif #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. 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 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. Es sind nur einfache logische Ausdrücke mit numerischen Werten erlaubt. FALSE==0, TRUE != 0.

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

22 2208-CPräprozessorBeispiel int main () { #if BETA && DEMO printf( "Beta-Version %i\n%i - Tage Demo\n",BETA,DEMO); #elif BETA printf( "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}

23 2308-CPräprozessor 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=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=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=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"); } gcc –ansi bed.c –DBETA=0 –DDEMO=0 –E –o bed.i int main () { printf("Final Release\nunbegrenzte Lizenz\n"); }

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


Herunterladen ppt "08-CPräprozessor 1 Der C-Präprozessor. 208-CPräprozessor Der C-Präprozessor Bevor ein Programm vom eigentlichen C-Compiler bearbeitet wird, wird es vom."

Ähnliche Präsentationen


Google-Anzeigen