cpp(1) USER COMMANDS cpp(1)
NAME
cpp - the C language preprocessor
SYNOPSIS
/usr/lib/cpp [ option ... ] [ ifile [ ofile ] ]
DESCRIPTION
Cpp is the C language preprocessor which is invoked as the
first pass of any C compilation using the cc(1) command.
Thus the output of cpp is designed to be in a form accept-
able as input to the next pass of the C compiler. As the C
language evolves, cpp and the rest of the C compilation
package will be modified to follow these changes. There-
fore, the use of cpp other than in this framework is not
suggested. The preferred way to invoke cpp is through the
cc(1) command since the functionality of cpp may someday be
moved elsewhere. See m4(1) for a general macro processor.
Cpp optionally accepts two file names as arguments. Ifile
and ofile are respectively the input and output for the
preprocessor. They default to standard input and standard
output if not supplied.
The following options to cpp are recognized:
-P Preprocess the input without producing the line control
information used by the next pass of the C compiler.
-C By default, cpp strips C-style comments. If the -C
option is specified, all comments (except those found
on cpp directive lines) are passed along.
-Uname
Remove any initial definition of name, where name is a
reserved symbol that is predefined by the particular
preprocessor. The current list of these possibly
reserved symbols includes: None of these are defined
by cpp. Instead, the compiler drivers, cc(1), as(1),
pc(1), and f77(1) define these symbols.
operating system: unix, ibm, gcos, os, tss,
dmert
target hardware: mips, interdata, pdp11, u370,
u3b, u3b5, u3b2, u3b20d, vax
host hardware: host_mips
languages: LANGUAGE_C,
LANGUAGE_ASSEMBLY,
LANGUAGE_PASCAL,
LANGUAGE_FORTRAN
UNIX system variant: RES, RT
lint(1): lint
-Dname
1
cpp(1) USER COMMANDS cpp(1)
-Dname=def
Define name as if by a #define directive. If no =def
is given, name is defined as 1. The -D option has
lower precedence than the -U option. That is, if the
same name is used in both a -U option and a -D option,
the name will be undefined regardless of the order of
the options.
-Idir
Change the algorithm for searching for #include files
whose names do not begin with / to look in dir before
looking in the directories on the standard list. Thus,
#include files whose names are enclosed in "" will be
searched for first in the directory of the ifile argu-
ment, then in directories named in -I options, and last
in directories on a standard list. For #include files
whose names are enclosed in <>, the directory of the
ifile argument is not searched.
-I This option changes the algorithm for searching for
#include files to never look in the standard list.
-M Print, one per line on standard output; the path names
of included files. Each is prefixed with ifile's last
component name with the suffix changed to `.o' followed
by a `:' and a space (for example ``hello.o:
/usr/include/stdio.h'').
Two special names are understood by cpp. The name LINE
is defined as the current line number (as a decimal integer)
as known by cpp, and FILE is defined as the current file
name (as a C string) as known by cpp. They can be used any-
where (including in macros) just as any other defined name.
All cpp directives start with lines begun by #. The direc-
tives are:
#define name token-string
Replace subsequent instances of name with token-string.
#define name( arg, ..., arg ) token-string
Notice that there can be no space between name and the
(. Replace subsequent instances of name followed by a
(, a list of comma separated tokens, and a ) by token-
string where each occurrence of an arg in the token-
string is replaced by the corresponding token in the
comma separated list. When a macro with arguments is
expanded, the arguments are placed into the expanded
token-string unchanged. After the entire token-string
has been expanded, cpp re-starts its scan for names to
expand at the beginning of the newly created token-
string.
2
cpp(1) USER COMMANDS cpp(1)
#undef name
Cause the definition of name (if any) to be forgotten
from now on.
#ident "string"
This directive is recognized for compatibility but
ignored.
#include "filename"
#include <filename>
Include at this point the contents of filename (which
will then be run through cpp). When the <filename>
notation is used, filename is only searched for in the
standard places. See the -I option above for more
detail.
#line integer-constant "filename"
Causes cpp to generate line control information for the
next pass of the C compiler. Integer-constant is the
line number of the next line and filename is the file
where it comes from. If "filename" is not given, the
current file name is unchanged.
#endif
Ends a section of lines begun by a test directive (#if,
#ifdef, or #ifndef). Each test directive must have a
matching #endif.
#ifdef name
The lines following will appear in the output if and
only if name has been the subject of a previous #define
without being the subject of an intervening #undef.
#ifndef name
The lines following will not appear in the output if
and only if name has been the subject of a previous
#define without being the subject of an intervening
#undef.
#if constant-expression
Lines following will appear in the output if and only
if the constant-expression evaluates to non-zero. All
binary non-assignment C operators, the ?: operator, the
unary -, !, and ~ operators are all legal in constant-
expression. The precedence of the operators is the
same as defined by the C language. There is also a
unary operator defined, which can be used in constant-
expression in these two forms: defined ( name ) or
defined name. This allows the utility of #ifdef and
#ifndef in a #if directive. Only these operators,
integer constants, and names which are known by cpp
should be used in constant-expression. In particular,
3
cpp(1) USER COMMANDS cpp(1)
the sizeof operator is not available.
To test whether either of two symbols, foo and fum, are
defined, use
#if defined(foo) || defined(fum)
#else
Reverses the notion of the test directive which matches
this directive. So if lines previous to this directive
are ignored, the following lines will appear in the
output. And vice versa.
The test directives and the possible #else directives can be
nested.
FILES
/usr/include standard directory for #include files
SEE ALSO
cc(1), as(1), pc(1), f77(1), m4(1)
DIAGNOSTICS
The error messages produced by cpp are intended to be self-
explanatory. The line number and filename where the error
occurred are printed along with the diagnostic.
NOTES
When newline characters were found in argument lists for
macros to be expanded, previous versions of cpp put out the
newlines as they were found and expanded. The current ver-
sion of cpp replaces these newlines with blanks to alleviate
problems that the previous versions had when this occurred.
4