#ifdef bezeichnerMan versteht dieses Beispiel besser, indem man sich das Ergebnis des Präprozessorlaufes anzeigen läßt. Dazu ist der C-Compiler so aufzurufen:
/* wenn bezeichner definiert ist */
...
#else
/* wenn bezeichner nicht definiert ist */
...
#endif #ifndef bezeichner
/* wenn bezeichner nicht definiert ist */
...
#else
/* wenn bezeichner definiert ist */
...
#endif #if konst_ausdruck
/* wenn konst_ausdruck TRUE (!=0) ist */
...
#elif konst_ausdruck
/* nur ANSI-C */
...
#else
/* wenn konst_ausdruck FALSE (==0) ist */
...
#endif
In konst_ausdruck kann ein Ausdruck der Formdefined ( bezeichner )vorkommen, der wie bei #ifdef die Definition von bezeichner prüft. Diese Definition kann auch per Option beim Aufruf des C-Compilers erfolgen:cc -Dbezeichner file.c
BEISPIELE/b323.c: #include <stdio.h> #define EX(k) k+3.14159 #define PR(a) printf("%d ",(int)(a)) #define PRINT(a) PR(a); putchar('\n') #define PRINT2(a,b) PR(a), PRINT(b) #define PRINT3(a,b,c) PR(a); PRINT2(b,c) #define MAX(a,b) (a<b ? b : a) main() /* Praeprozessor */ { int i,x=1,y=2; PRINT( 2*EX(2) ); for( i=0; i<=4; i+=2 ) PRINT2( i, 5*i+32 ); #ifndef PRX PRINT3( MAX(x++,y),x,y ); PRINT3( MAX(x++,y),x,y ); #else PRINT3( MAX(x++,++y),x,y ); PRINT3( MAX(x,y),x,y ); #endif }
cc -P -E b323.cDas "aufbereitete" C-Programm wird in stdout (unstrukturiert) angezeigt:
VERBATIM/b323: main() { int i,x=1,y=2; printf("%d ",(int)(2*2+3.14159)); putchar('\n'); for( i=0; i<=4; i+=2 ) printf("%d ",(int)(i)), printf("%d ",(int)(5*i+32)); putchar('\n'); printf("%d ",(int)(( x++ < y ? y : x++ ))); printf("%d ",(int)(x)), printf("%d ",(int)(y)); putchar('\n'); printf("%d ",(int)(( x++ < y ? y : x++ ))); printf("%d ",(int)(x)), printf("%d ",(int)(y)); putchar('\n'); }