08-CPräprozessor 1 Der C-Präprozessor. 208-CPräprozessor Der C-Präprozessor Bevor ein Programm...

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

Transcript of 08-CPräprozessor 1 Der C-Präprozessor. 208-CPräprozessor Der C-Präprozessor Bevor ein Programm...

Page 1: 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.

08-CPräprozessor 1

Der C-PräprozessorDer C-Präprozessor

Page 2: 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.

208-CPräprozessor

Der C-PräprozessorDer C-Präprozessor Bevor ein Programm vom eigentlichen C-Compiler bearbeitet Bevor ein Programm vom eigentlichen C-Compiler bearbeitet

wird, wird es vom C-Präprozessor bearbeitet. Dabei werden wird, wird es vom C-Präprozessor bearbeitet. Dabei werden reine Textersetzungen durchgeführt. Der Präprozessor erzeugt reine Textersetzungen durchgeführt. Der Präprozessor erzeugt den vom Compiler zu übersetzenden Quelltext.den vom Compiler zu übersetzenden Quelltext.

C-Quelltext mitPräprozessor-anweisungen

C-Quelltext ohnePräprozessor-anweisungen

Objektmodule

AusführbaresProgramm Bibliotheken

Prä

proz

esso

r

Com

pile

rV

erbi

nder

Page 3: 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.

308-CPräprozessor

Die PräprozessoranweisungenDie Präprozessoranweisungen Anweisungen für den Präprozessor beginnen immer mit Anweisungen für den Präprozessor beginnen immer mit ## in der ersten in der ersten

Spalte.Spalte. Es gibt folgende Präprozessoranweisungen:Es gibt folgende Präprozessoranweisungen:

#include#include : Einfügen einer Datei : Einfügen einer Datei #define#define : Definieren einer Konstanten oder eines Makros : Definieren einer Konstanten oder eines Makros #if#if (#ifdef(#ifdef, , #ifndef#ifndef) - ) - #elif#elif - - #else#else – – #endif#endif : bedingte : bedingte

ÜbersetzungÜbersetzung

Page 4: 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.

408-CPräprozessor

Die Die includeinclude-Anweisung-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-Es ist genau so als ob der Inhalt der eingefügten Datei statt der include-

Anweisung steht.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);

printf("char[%i]=%c\n",c,c);

}

Page 5: 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.

508-CPräprozessor

Compileraufruf:Compileraufruf:gcc –ansi prog.c –E –o prog.igcc –ansi prog.c –E –o prog.ierzeugt die Datei „erzeugt die Datei „prog.iprog.i““

# 1 "prog.c"# 1 "prog.c"

# 1 "limits.h" 1# 1 "limits.h" 1

char min_char=-128;char min_char=-128;

char max_char=127;char max_char=127;

# 1 "prog.c" 2# 1 "prog.c" 2

int main()int main()

{{

char c;char c;

for (c=min_char;c<max_char;c++)for (c=min_char;c<max_char;c++)

printf("char[%i]=%c\n",c,c);printf("char[%i]=%c\n",c,c);

printf("char[%i]=%c\n",c,c);printf("char[%i]=%c\n",c,c);

}}

Page 6: 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.

608-CPräprozessor

Zwei Formen der include-AnweisungZwei Formen der include-Anweisung #include <filename>#include <filename>

sucht die Datei im Standarbibliothekspfadsucht die Datei im Standarbibliothekspfad #include "filename"#include "filename"

sucht die Datei im aktuellen Verzeichnissucht die Datei im aktuellen Verzeichnis Z.B.:Z.B.:

#include <stdio.h>#include <stdio.h>

#include "limits.h"#include "limits.h" Anwendungen der include-Anweisung:Anwendungen der include-Anweisung:

Einfügen von „header“-Dateien, die die Schnittstellendefinition von Einfügen von „header“-Dateien, die die Schnittstellendefinition von Prozeduren enthaltenProzeduren enthalten

Einfügen von Definitionen von Konstanten und TypenEinfügen von Definitionen von Konstanten und Typen

Page 7: 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.

708-CPräprozessor

DieDie define define - Anweisung - Anweisung Mit der Mit der definedefine-Anweisung werden Konstanten und Macros definiert. -Anweisung werden Konstanten und Macros definiert.

Allgemeine Form:Allgemeine Form:#define <NAME> <ZEICHENKETTE>#define <NAME> <ZEICHENKETTE>

Nach dieser Nach dieser definedefine-Anweisung wird jedes Auftreten von -Anweisung wird jedes Auftreten von <NAME><NAME> als als ganzes Wort im Text durch ganzes Wort im Text durch <ZEICHENKETTE><ZEICHENKETTE> ersetzt. ersetzt.

Page 8: 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.

808-CPräprozessor

BeispielBeispiel limits.hlimits.h

#define MIN_CHAR –128#define MIN_CHAR –128#define MAX_CHAR 127#define MAX_CHAR 127

prog.cprog.c#include "limits.h"#include "limits.h"int main()int main(){{char c;char c;for (c=MIN_CHAR;c<MAX_CHAR;c++)for (c=MIN_CHAR;c<MAX_CHAR;c++)printf("char[%i]=%c\n",c,c);printf("char[%i]=%c\n",c,c);printf("char[%i]=%c\n",c,c);printf("char[%i]=%c\n",c,c);}}

Page 9: 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.

908-CPräprozessor

# 1 "prog.c"# 1 "prog.c"

# 1 "limits.h" 1# 1 "limits.h" 1

# 1 "prog.c" 2# 1 "prog.c" 2

int main()int main()

{{

char c;char c;

for (c= -128 ;c< 127 ;c++)for (c= -128 ;c< 127 ;c++)

printf("char[%i]=%c\n",c,c);printf("char[%i]=%c\n",c,c);

printf("char[%i]=%c\n",c,c);printf("char[%i]=%c\n",c,c);

}}

Page 10: 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.

1008-CPräprozessor

Zusammen mit der Zusammen mit der includeinclude-Anweisung kann damit ein Programm sehr -Anweisung kann damit ein Programm sehr flexible geschrieben und dann durch geringe Änderungen an die Hardware flexible geschrieben und dann durch geringe Änderungen an die Hardware angepasst werden.angepasst werden.

Beispiel:Beispiel:#define TEXT1 "Das ist ein ganz langer Text."#define TEXT1 "Das ist ein ganz langer Text."#define TEXT2 "Das ist noch ein langer Text."#define TEXT2 "Das ist noch ein langer Text."#define TEXT3 "Das ist der dritte lange Text."#define TEXT3 "Das ist der dritte lange Text."printf(" %s\n %s\n %s\n",TEXT1,TEXT2,TEXT3);printf(" %s\n %s\n %s\n",TEXT1,TEXT2,TEXT3);

define-define-Anweisung wird genutzt, um Programme übersichtlicher zu Anweisung wird genutzt, um Programme übersichtlicher zu gestalten und bestimmte möglicherweise öfter zu ändernde Programmteile gestalten und bestimmte möglicherweise öfter zu ändernde Programmteile an einer Stelle zu konzentrieren.an einer Stelle zu konzentrieren.

definedefine-Anweisungen können ersetzt werden durch die Angabe des D--Anweisungen können ersetzt werden durch die Angabe des D-Schalters beim Compilerauffruf. Z.B:Schalters beim Compilerauffruf. Z.B:gcc –DTRUE=1 hello.cgcc –DTRUE=1 hello.cbewirkt die Einfügung der Anweisungbewirkt die Einfügung der Anweisung#define TRUE 1#define TRUE 1vor das Programm vor das Programm hello.chello.c..

Page 11: 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.

1108-CPräprozessor

MacrosMacros Macros dienen der parametrisierten Ersetzung von Zeichenketten durch Macros dienen der parametrisierten Ersetzung von Zeichenketten durch

Ausdrücke.Ausdrücke. Beispiel:Beispiel:

#define MAX(A,B) (((A)>(B))?(A):(B))#define MAX(A,B) (((A)>(B))?(A):(B))float a,b,c;float a,b,c;c=MAX(a+b,a-b);c=MAX(a+b,a-b);wirkt wiewirkt wiec=(((a+b)>(a-b))?(a+b):(a-b));c=(((a+b)>(a-b))?(a+b):(a-b));

Achtung!Achtung! Immer ausreichend Klammern gebrauchen!Immer ausreichend Klammern gebrauchen! Trennzeichen in der Trennzeichen in der definedefine-Anweisung trennen den zu definierenden Namen -Anweisung trennen den zu definierenden Namen

von der Definition, solange sie nicht in Klammern eingeschlossen sind. 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))#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 Bedeutungsind zulässig haben aber z.T. unterschiedliche Bedeutung

Page 12: 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.

1208-CPräprozessor

#define MAX(A,B) (((A)>(B))?(A):(B))#define MAX(A,B) (((A)>(B))?(A):(B))

#define MIN(A,B) (((A)<(B))?(A):(B))#define MIN(A,B) (((A)<(B))?(A):(B))

int main()int main()

{{

int i,j;int i,j;

int max=MAX(i,j);int max=MAX(i,j);

int min=MIN(i,j);int min=MIN(i,j);

int m=MAX(i-j,j-i)*MIN(i-j,j-i);int m=MAX(i-j,j-i)*MIN(i-j,j-i);

}}

Page 13: 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.

1308-CPräprozessor

# 1 "prog.c"# 1 "prog.c"

int main()int main()

{{

int i,j;int i,j;

int max= ((( i )>( j ))?( i ):( j )) ;int max= ((( i )>( j ))?( i ):( j )) ;

int min= ((( i )<( j ))?( i ):( j )) ;int min= ((( i )<( j ))?( i ):( j )) ;

int m= ((( i-j )>( j-i ))?( i-j ):( j-i )) * ((( i-j )<( int m= ((( i-j )>( j-i ))?( i-j ):( j-i )) * ((( i-j )<( j-i ))?( i-j ):( j-i )) ;j-i ))?( i-j ):( j-i )) ;

}}

Page 14: 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.

1408-CPräprozessor

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

<NAME1><NAME1> und und <NAME2>.<NAME2>.

Page 15: 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.

1508-CPräprozessor

#define PRINT(X) printf("Wert von %s = %i\n",#X,X)#define PRINT(X) printf("Wert von %s = %i\n",#X,X)

#define INIT(A,B) A##B=(A)*100+(B)#define INIT(A,B) A##B=(A)*100+(B)

int main()int main()

{{

int c=20;int c=20;

int j=0;int j=0;

int INIT(c,j);int INIT(c,j);

PRINT(c);PRINT(c);

PRINT(j);PRINT(j);

PRINT(cj);PRINT(cj);

}}

Page 16: 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.

1608-CPräprozessor

# 1 "oper.c"# 1 "oper.c"

int main()int main()

{{

int c=20;int c=20;

int j=0;int j=0;

int cj =( c )*100+( j ) ;int cj =( c )*100+( j ) ;

printf("Wert von %s = %i\n","c", c ) ;printf("Wert von %s = %i\n","c", c ) ;

printf("Wert von %s = %i\n","j", j ) ;printf("Wert von %s = %i\n","j", j ) ;

printf("Wert von %s = %i\n","cj", cj ) ;printf("Wert von %s = %i\n","cj", cj ) ;

}}

Page 17: 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.

1708-CPräprozessor

Vordefinierte Macros - GNUCVordefinierte 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

Page 18: 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.

1808-CPräprozessor

BeispielBeispielint 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);

}

Page 19: 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.

1908-CPräprozessor

Macros als Compiler-SchalterMacros als Compiler-Schalter Durch Angabe des Compilerschalters Durch Angabe des Compilerschalters "-D""-D" können Macros nachträglich können Macros nachträglich

definiert werden. Z.B.:definiert werden. Z.B.:cc hello.c –Dname1 –Dname2=wertcc hello.c –Dname1 –Dname2=wertentspricht der Einfügung vonentspricht der Einfügung von#define name1#define name1#define name2 wert#define name2 wertam Anfang des Quelltextes am Anfang des Quelltextes hello.chello.c

Wird häufig benutzt um spezielle Versionen aus einer Quelle zu erzeugen, Wird häufig benutzt um spezielle Versionen aus einer Quelle zu erzeugen, z.B.:z.B.: HardwareabhängigkeitHardwareabhängigkeit Genauigkeitsversionen (float, double)Genauigkeitsversionen (float, double) GrößenversionenGrößenversionen Unterschiedliche Interface (X11, Windows)Unterschiedliche Interface (X11, Windows)

Page 20: 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.

2008-CPräprozessor

Bedingte ÜbersetzungBedingte Übersetzung #if#if (#ifdef(#ifdef, , #ifndef#ifndef) - ) - #elif#elif - - #else#else – – #endif#endif Mit Hilfe der Anweisungen zur bedingten Übersetzung können bestimmte Mit Hilfe der Anweisungen zur bedingten Übersetzung können bestimmte

Teile des C-Programmes zur Übersetzung ausgewählt bzw. von der Teile des C-Programmes zur Übersetzung ausgewählt bzw. von der Übersetzung ausgenommen werden.Übersetzung ausgenommen werden.

Allgemeine Form:Allgemeine Form:#if AUSDRUCK1#if AUSDRUCK1text1text1#elif AUSDRUCK2#elif AUSDRUCK2text2text2#elif AUSDRUCK3#elif AUSDRUCK3text3text3#else#elsetext4text4#endif#endif

Es sind nur einfache logische Ausdrücke mit numerischen Werten erlaubt. Es sind nur einfache logische Ausdrücke mit numerischen Werten erlaubt. FALSE==0, TRUE != 0.FALSE==0, TRUE != 0.

Page 21: 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.

2108-CPräprozessor

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

Page 22: 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.

2208-CPräprozessor

BeispielBeispielint main ()int main ()

{{

#if BETA && DEMO#if BETA && DEMO

printf(printf(

"Beta-Version %i\n%i - Tage Demo\n",BETA,DEMO);"Beta-Version %i\n%i - Tage Demo\n",BETA,DEMO);

#elif BETA#elif BETA

printf(printf(

"Beta-Version %i\nunbegrenzte Lizenz\n",BETA);"Beta-Version %i\nunbegrenzte Lizenz\n",BETA);

#elif DEMO#elif DEMO

printf("Final Release\n%i - Tage Demo\n",DEMO);printf("Final Release\n%i - Tage Demo\n",DEMO);

#else#else

printf("Final Release\nunbegrenzte Lizenz\n");printf("Final Release\nunbegrenzte Lizenz\n");

#endif#endif

}}

Page 23: 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.

2308-CPräprozessor

gcc –ansi bed.c –DBETA=2 –DDEMO=30 –E –o bed.igcc –ansi bed.c –DBETA=2 –DDEMO=30 –E –o bed.iint main ()int main (){{

printf("Beta-Version %i\n%i - Tage Demo\n",2 ,30 );printf("Beta-Version %i\n%i - Tage Demo\n",2 ,30 );} }

gcc –ansi bed.c –DBETA=0 –DDEMO=30 –E –o bed.igcc –ansi bed.c –DBETA=0 –DDEMO=30 –E –o bed.iint main ()int main (){{

printf("Final Release\n%i - Tage Demo\n",30 );printf("Final Release\n%i - Tage Demo\n",30 );}}

gcc –ansi bed.c –DBETA=2 –DDEMO=0 –E –o bed.igcc –ansi bed.c –DBETA=2 –DDEMO=0 –E –o bed.iint main ()int main (){{

printf("Beta-Version %i\nunbegrenzte Lizenz\n",2 );printf("Beta-Version %i\nunbegrenzte Lizenz\n",2 );}}

gcc –ansi bed.c –DBETA=0 –DDEMO=0 –E –o bed.igcc –ansi bed.c –DBETA=0 –DDEMO=0 –E –o bed.iint main ()int main (){{

printf("Final Release\nunbegrenzte Lizenz\n");printf("Final Release\nunbegrenzte Lizenz\n");}}

Page 24: 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.

2408-CPräprozessor

Typisches Header-FileTypisches Header-Filestdio.hstdio.h

#ifndef _INC_STDIO#ifndef _INC_STDIO

#define _INC_STDIO#define _INC_STDIO

......

#endif /* _INC_STDIO */#endif /* _INC_STDIO */