#38 Der Präprozessor Flashcards

1
Q

Was sind die Drei wichtigsten Aufgaben des Präprozessors?

A

-Einbinden externer Dateien (#include)
- Textuelles Ersetzen symbolischer Konstanten und Makros (#define)
- Bedingte Kompilierung (#ifdef)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Nenne die Phasen der Übersetzung in Bezug auf den Präprozessor.

A

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 |

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Wie ist die Syntax von Präprozessoranweisungen?

A

-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
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Wie binde ich externe Dateien ein? Nenne ihre Syntax und Anwendungsbereiche.

A

-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>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Erläutere wie man Makros anwendet (Syntax,definition,ablauf)

A
  • 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;
    }
    ________________________________
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Was sind Parametrisierte Makros?

A

„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!!!
______________________________________________

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q
A

Ü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
________________________________________________

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Welche vordefinierten Präprozessoranweisungen fallen dir ein?

A

_ LINE _: aktuelle Quelltext-Zeilennummer
_ FILE _: Name der Quelltextdatei
_ DATE _: aktuelles Datum (Mmm dd yyyy)
_ TIME _: aktuelle Uhrzeit (hh:mm:ss)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly