Navigation

3.2.3 Bedingte Compilierung

bestimmte Teile des Quellfiles können von der Compilierung ausgeschlossen werden:
#ifdef bezeichner
/* 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 Form
defined ( 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
}

Man versteht dieses Beispiel besser, indem man sich das Ergebnis des Präprozessorlaufes anzeigen läßt. Dazu ist der C-Compiler so aufzurufen:
cc -P -E b323.c
Das "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');
}

Navigation