Click on any of the 687 commands below to get a description and list of available options. All links in the command summaries point to the online version of the book on Safari Bookshelf.
GNU C language preprocessor. cpp is normally invoked as the first pass of any C compilation by the gcc command. The output of cpp is a form acceptable as input to the next pass of the C compiler. The ifile and ofile options are, respectively, the input and output for the preprocessor; they default to standard input and standard output.
Options
-$
Do not allow $ in identifiers.
-ansi
Use 1990 ISO C standard. This is equivalent to -std=c89.
-dD
Similar to -dM, but exclude predefined macros and include results of preprocessing.
-dM
Suppress normal output. Print series of #defines that create the macros used in the source file.
-dN
Similar to -dD, but don't print macro expansions.
-dI
Print #include directives in addition to other output.
-fpreprocessed
Treat file as already preprocessed. Skip most processing directives, remove all comments, and tokenize file.
-ftabstop=width
Set distance between tabstops so columns will be reported correctly in warnings and errors. Default is 8.
Search dir for header files when a header file is not found in any of the included directories.
-imacrosfile
Process macros in file before processing main files.
-includefile
Process file before main file.
-iprefixprefix
When adding directories with -iwithprefix, prepend prefix to the directory's name.
-isystemdir
Search dir for header files after searching directories specified with -I but before searching standard system directories.
-iwithprefixdir
Append dir to the list of directories to be searched when a header file cannot be found in the main include path. If -iprefix has been set, prepend that prefix to the directory's name.
-iwithprefixbeforedir
Insert dir at the beginning of the list of directories to be searched when a header file cannot be found in the main include path. If -iprefix has been set, prepend that prefix to the directory's name.
-lang-c, -lang-c++, -lang-objc, -lang-objc++
Expect the source to be in C, C++, Objective C, or Objective C++, respectively.
-lint
Display all lint commands in comments as #pragma lintcommand.
-nostdinc
Search only specified, not standard, directories for header files.
-nostdinc++
Suppress searching of directories believed to contain C++-specific header files.
-ofile
Write output to file. (Same as specifying a second filename in the command line.)
-pedantic
Warn verbosely.
-pedantic-errors
Produce a fatal error in every case in which -pedantic would have produced a warning.
-std=standard
Specify C standard of input file. Accepted values are:
iso9899:1990, c89
1990 ISO C standard.
iso9899:199409
1994 amendment to the 1990 ISO C standard.
iso9899:1999, c99, iso9899:199x, c9x
1999 revised ISO C standard.
gnu89
1990 C Standard with gnu extensions. The default value.
gnu99, gnu9x
1999 revised ISO C standard with gnu extensions.
-traditional
Behave like traditional C, not ANSI.
-trigraphs
Convert special three-letter sequences, meant to represent missing characters on some terminals, into the single character they represent.
-undef
Suppress definition of all nonstandard macros.
-v
Verbose mode.
-version
Print version number, then process file.
--version
Print version number, then exit.
-w
Don't print warnings.
-xlanguage
Specify the language of the input file. language may be c, c++, objective-c, or assembler-with-cpp. By default, language is deduced from the filename extension. If the extension is unrecognized, the default is c.
-Aname[=def]
Assert name with value def as if defined by #assert. To turn off standard assertions, use -A-.
-A-name[=def]
Cancel assertion name with value def.
-C
Retain all comments except those found on cpp directive lines. By default, cpp strips C-style comments.
-Dname[=def]
Define name with value def as if by a #define. If no =def is given, name is defined with value 1. -D has lower precedence than -U.
-E
Preprocess the source files, but do not compile. Print result to standard output. This option is usually passed from gcc.
-H
Print pathnames of included files, one per line, on standard error.
-Idir
Search in directory dir for #include files whose names do not begin with / before looking in directories on standard list. #include files whose names are enclosed in double quotes and do not begin with / will be searched for first in the current directory, then in directories named on -I options, and last in directories on the standard list.
-I-
Split includes. Search directories specified by -I options preceding this one for header files included with quotes (#include "file.h") but not for header files included with angle brackets (#include <file.h>). Search directories specified by -I options following this one for all header files.
-M [-MG]
Suppress normal output. Print a rule for make that describes the main source file's dependencies. If -MG is specified, assume that missing header files are actually generated files, and look for them in the source file's directory.
-MFfile
Print rules generated by -M or -MM to file.
-MDfile
Similar to -M, but output to file; also compile the source.
-MM
Similar to -M, but describe only those files included as a result of #include"file".
-MMDfile
Similar to -MD, but describe only the user's header files.
-MQtarget
Similar to -MT, but quote any characters that are special to make.
-MTtarget
Specify the target to use when generating a rule for make. By default, the target is based on the name of the main input file.
-P
Preprocess input without producing line-control information used by next pass of the C compiler.
-Uname
Remove any initial definition of name, where name is a reserved symbol predefined by the preprocessor, or a name defined on a -D option. Names predefined by cpp are unix and i386 (for Intel systems).
-Wall
Warn both on nested comments and trigraphs.
-Wcomment, -Wcomments
Warn when encountering the beginning of a nested comment.
-Wtraditional
Warn when encountering constructs that are interpreted differently in ANSI than in traditional C.
-Wtrigraphs
Warn when encountering trigraphs, which are three-letter sequences meant to represent missing characters on some terminals.
Special names
cpp understands various special names, some of which are:
_ _DATE_ _
Current date (e.g., Jan 10 2003).
_ _FILE_ _
Current filename (as a C string).
_ _LINE_ _
Current source line number (as a decimal integer).
_ _TIME_ _
Current time (e.g., 12:00:00).
These special names can be used anywhere, including in macros, just like any other defined names. cpp's understanding of the line number and filename may be changed using a #line directive.
Directives
All cpp directive lines start with # in column 1. Any number of blanks and tabs is allowed between the # and the directive. The directives are:
#assertname (string)
Define a question called name, with an answer of string. Assertions can be tested with #if directives. The predefined assertions for #system, #cpu, and #machine can be used for architecture-dependent changes.
#unassertname
Remove assertion for question name.
#definename token-string
Define a macro called name, with a value of token-string. Subsequent instances of name are replaced with token-string.
#definename( arg, ... , arg ) token-string
This allows substitution of a macro with arguments. token-string will be substituted for name in the input file. Each call to name in the source file includes arguments that are plugged into the corresponding args in token-string.
#undefname
Remove definition of the macro name. No additional tokens are permitted on the directive line after name.
#identstring
Put string into the comment section of an object file.
#include"filename",#include<filename>
Include contents of filename at this point in the program. No additional tokens are permitted on the directive line after the final " or >.
#lineinteger-constant"filename"
Cause cpp to generate line-control information for the next pass of the C compiler. The compiler behaves as if integer-constant is the line number of the next line of source code and filename (if present) is the name of the input file. No additional tokens are permitted on the directive line after the optional filename.
#endif
End a section of lines begun by a test directive (#if, #ifdef, or #ifndef). No additional tokens are permitted on the directive line.
#ifdefname
Lines following this directive and up to matching #endif or next #else or #elif will appear in the output if name is currently defined. No additional tokens are permitted on the directive line after name.
#ifndefname
Lines following this directive and up to matching #endif or next #else or #elif will appear in the output if name is not currently defined. No additional tokens are permitted on the directive line after name.
#ifconstant-expression
Lines following this directive and up to matching #endif or next #else or #elif will appear in the output if constant-expression evaluates to nonzero.
#elifconstant-expression
An arbitrary number of #elif directives are allowed between an #if, #ifdef, or #ifndef directive and an #else or #endif directive. The lines following the #elif and up to the next #else, #elif, or #endif directive will appear in the output if the preceding test directive and all intervening #elif directives evaluate to zero, and the constant-expression evaluates to nonzero. If constant-expression evaluates to nonzero, all succeeding #elif and #else directives will be ignored.
#else
Lines following this directive and up to the matching #endif will appear in the output if the preceding test directive evaluates to zero, and all intervening #elif directives evaluate to zero. No additional tokens are permitted on the directive line.