Next: , Up: Using the preprocessor


4.1 Defining macros

The following program demonstrates the most common use of the C preprocessor. It uses the preprocessor conditional #ifdef to check whether a macro is defined:

     #include <stdio.h>
     
     int
     main (void)
     {
     #ifdef TEST
       printf ("Test mode\n");
     #endif
       printf ("Running...\n");
       return 0;
     }

When the macro is defined, the preprocessor includes the corresponding code up to the closing #endif command. In this example, the macro which is tested is called TEST, and the conditional part of the source code is a printf statement which prints the message “Test mode”.

The gcc option -DNAME defines a preprocessor macro NAME from the command line. If the program above is compiled with the command-line option -DTEST, the macro TEST will be defined and the resulting executable will print both messages:

     $ gcc -Wall -DTEST dtest.c
     $ ./a.out
     Test mode
     Running...

If the same program is compiled without the -D option then the “Test mode” message is omitted from the source code after preprocessing, and the final executable does not include the code for it:

     $ gcc -Wall dtest.c
     $ ./a.out
     Running...

Macros are generally undefined, unless specified on the command line with the option -D, or in a source file (or library header file) with #define. Some macros are automatically defined by the compiler—these typically use a reserved namespace beginning with a double-underscore prefix ‘__’.

The complete set of predefined macros can be listed by running the GNU preprocessor cpp with the option -dM on an empty file:

     $ cpp -dM /dev/null
     #define __i386__ 1
     #define __i386 1
     #define i386 1
     #define __unix 1
     #define __unix__ 1
     #define __ELF__ 1
     #define unix 1
     .......

Note that this list includes a small number of system-specific macros defined by gcc which do not use the double-underscore prefix. These non-standard macros can be disabled with the -ansi option of gcc.