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.