#38 Der Präprozessor Flashcards
Was sind die Drei wichtigsten Aufgaben des Präprozessors?
-Einbinden externer Dateien (#include)
- Textuelles Ersetzen symbolischer Konstanten und Makros (#define)
- Bedingte Kompilierung (#ifdef)
Nenne die Phasen der Übersetzung in Bezug auf den Präprozessor.
Quelldatei prog.c
|
|
V
________________
|Präprozessor|
________________
|
|
V
Quelldatei mit ausgewerteten
Präprozessorkommandos
|
|
V
______________
| Compiler |
______________
|
|
V
Objektdatei prog.o
| _______________Weitere Dateien
| |
V V
________________
________________
Ausführbare Datei
prog / prog.exe
Linker |
Wie ist die Syntax von Präprozessoranweisungen?
-Präprozessoranweisungen beginnen mit #
- Anweisungen über mehr als eine Zeile: Jede Zeile, die fortgesetzt werden
soll, muss mit \ abgeschlossen werden.
Bsp:
#define PRINT_STUFF printf(“Hallo\n”); \
printf(“Welt!\n”);
/**
* Hautprogramm.
*/
int main()
{
PRINT_STUFF
}
Wie binde ich externe Dateien ein? Nenne ihre Syntax und Anwendungsbereiche.
-Mit #include wird eine Datei an der angegebenen Stelle in den Quelltext
eingefügt.
- Syntax
- #include <datei>: Sucht die Datei im Standard Include-Verzeichnis
- #include "datei": Sucht die Datei im aktuellen Verzeichnis
- Anwendung
- Einbinden der Standard-Header-Dateien
- Einbinden eigener Header-Dateien</datei>
Erläutere wie man Makros anwendet (Syntax,definition,ablauf)
- Makrodefinition mit #define
- Makrosubstitution: der Bezeichner des Makros wird im folgenden durch die
definierte Zeichenkette ausgetauscht. - Syntax:
-#define name [(Parameterliste)] [wert] - Makros mit/ohne Parameter und mit/ohne Ersetzungstext möglich
Bsp:
_______________________________
#define PI 3.141592
#define OR ||
if ((x < 10) OR (y < 10)) {
z = PI;
}
_______________________________
|
| Präprozessor
V
________________________________
if ((x < 10) || (y < 10)) {
z = 3.141592;
}
________________________________
Was sind Parametrisierte Makros?
„Zwischenstufe“ zur Funktion
_______________________________________________
#define MAX(x,y) (((x)>=(y))?(x):(y))
…
z = MAX(3.2, sin(y));
______________________________________________
____________________________________________
#define TAUSCHE_INT(x,y) \
{ \
int h; \
h = x; x = y; y = h; \
}
…
int i = 3, j = 5;
TAUSCHE_INT(i, j)
_______________________________________________
______________________________________________
VORSICHT!:ASSOZIATIVITÄT NACH EINSETZEN BERÜCKSICHTIGEN!!!
#define MAX(x,y) x > y ? x : y
int main() {
int a = 5 * MAX(3, 5);
printf(“%d\n”, a);
return 0;
}
______________________________________________
|
|
V
______________________________________________
int main() {
int a = 5 * 3 > 5 ? 3 : 5;
printf(“%d\n”, a);
return 0;
} AUSGABE=3!!
______________________________________________
______________________________________________
#include <stdio.h>
#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main() {
int a = 5 * MAX(3, 5);
printf("%d\n", a);
return 0;
}
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
|
|
V
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
#include <stdio.h></stdio.h></stdio.h>
int main() {
int a = 5 * ((3) > (5) ? (3) : (5));
printf(“%d\n”, a);
return 0;
}AUSGABE=25!!!
______________________________________________
Übersetzung abhängig davon, ob ein Makro definiert ist oder nicht
(Variante 1).
- Syntax:
– #ifdef Bezeichner1 oder #ifndef Bezeichner1
…
[#else
…
]
#endif
________________________________________________
_________________________________________________
#define DEBUG
…
for(i = 0; i < 100; i++)
{
#ifdef DEBUG
printf(“Schleifendurchlauf %d\n”, i);
#endif
…
}
__________________________________________________
(Variante 2).
● Syntax:
– #if defined(Bezeichner1)
…
– [#elif defined(Bezeichner2)]
…
]
[#else
…
]
#endif
bsp:
_________________________________________________
#define DEUTSCH
int main()
{
#if defined(DEUTSCH)
printf(“Hallo Welt!\n”);
#elif defined(ENGLISH)
printf(“Hello World!\n”);
#else
#error unbekannte Sprache
#endif
return 0;
}
__________________________________________________
|
|
V
__________________________________________________
int main()
{
printf(“Hallo Welt!\n”);
return 0;
}
__________________________________________________
Syntax:
#if Ausdruck1
…
[#elif Ausdruck2
…
]
[#else
…
]
#endif
________________________________________________
|
|
V
_________________________________________________
#define ANZ 10
…
#if ANZ < 20
printf(“weniger als 20\n”);
#elif ANZ == 20
printf(“genau 20\n”);
#elif ANZ > 20
printf(“mehr als 20\n”);
#endif
________________________________________________
Welche vordefinierten Präprozessoranweisungen fallen dir ein?
_ LINE _: aktuelle Quelltext-Zeilennummer
_ FILE _: Name der Quelltextdatei
_ DATE _: aktuelles Datum (Mmm dd yyyy)
_ TIME _: aktuelle Uhrzeit (hh:mm:ss)