Next: Macros with values, Up: Using the preprocessor [Contents][Index]
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
.
Next: Macros with values, Up: Using the preprocessor [Contents][Index]