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
.