| |
|
SOFTWARE |
|
|
|
|
|
Es ist Konvention (wenn auch syntaktisch nicht zwingend), daß so definierte
Konstanten großgeschrieben werden.
Makroersetzung (Funktions-ähnlich); Beispiel:
#define CMULT(x) (3.8*(x))
#define SQ(x) ((x)*(x))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
Vorteil: Makroersetzungen funktionieren für alle Typen.
Nachteil: Die Wahrscheinlichkeit von Seiteneffekten ist hoch; so ist
z. B. die exzessive Klammerung in den obigen Beispielen absolut notwendig.
würde die Definition ohne Klammern erfolgen, z. B.SQ(x) x * x,
dann ergäbe der Aufruf SQ(2 + 5) nicht etwa 7 * 7 = 49,
sondern als Textersetzung "2 + 5 * 2 + 5" = 2 + 10 + 5 = 17.
Weiterhin werden u. U. auch ganze Ausdrücke ersetzt, und also
ebenso oft entwickelt.
#define wirkt nicht innerhalb von " ".
Die #define-Anweisung läßt sich rückgängig
machen mit dem #undef-Befehl; Beispiel: #undef MAX
#if, #else, #endif: Bedingte Compilierung. Beispiel:
#if MAX < 1000
#define MIN 100
#else
#define MIN 200
#endif
Allgemein wertet #if einen konstanten Integerausdruck aus;
statt '<' kann irgendein Vergleichsoperator stehen.
Weiterhin läßt sich mit #ifdef name verzweigen, wenn
dieses Token definiert, bzw. mit #ifndef name, wenn
es nicht definiert ist, Beispiel:
#ifdef DEBUG
printf("a hat hier den Wert: %f\n", a);
#endif
Eigene Präprozessor-Fehlermeldungen lassen sich mit
#error ausgeben, was außerdem den Compilierungsvorgang abbricht.
Beispiel:
#ifndef AFLAG
#error "AFLAG" nicht definiert!
#endif
|
| |
|
|
|