CPP(1) CPP(1)
NAME
cpp - the C language preprocessor
SYNOPSIS
LIBDIR/cpp [ option ... ] [ ifile [ ofile ]]
DESCRIPTION
The C language preprocessor, cpp, is invoked as the first
pass of any C compilation by the cc(1) command. Thus cpp's
output is designed to be in a form acceptable 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. Therefore, the use of cpp
other than through the cc(1) command is not suggested, 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.
-M Run only the macro preprocessor on the named C
programs, requesting it to generate Makefile
dependencies and send the result to the standard
output.
-Uname Remove any initial definition of name, where name is
a reserved symbol that is predefined by the
particular preprocessor. Following is the current
list of these possibly reserved symbols. The symbols
sgi and unix are always predefined by cpp. A symbol
(currently SVR3) which indicates the current version
of UNIX is also predefined, as is the symbol mips.
(These last two predefinitions may change at a later
date.) The compiler drivers, as(1), cc(1), pc(1),
and f77(1) define mips, host_mips, and the
appropriate LANGUAGE symbol.
operating system: unix, dmert, gcos, ibm, os, tss
SVR2, SVR3
Page 1 (last mod. 8/20/87)
CPP(1) CPP(1)
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
-Dname=def
Define name with value def as if by a #define. If
no =def is given, name is defined with value 1. The
-D option has lower precedence than the -U option.
That is, if the same name is used in both a -U
options 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 no 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 file with the #include line, then in the
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
file with the #include line is not searched. If -I
is given with no dir, cpp is instructed to suppress
the search of the standard list of include
directories. This standard list consists only of
/usr/include.
-H Print, one per line on standard error, the path
names of included files.
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
anywhere (including in macros) just as any other defined
name.
All cpp directive lines start with # in column 1. Any
number of blanks and tabs are allowed between the # and the
directive. The directives are:
#define name token-string
Replace subsequent instances of name with token-string.
Page 2 (last mod. 8/20/87)
CPP(1) CPP(1)
#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 sets of tokens, and a )
followed by token-string, where each occurrence of an
arg in the token-string is replaced by the
corresponding set of tokens 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.
#undef name
Cause the definition of name (if any) to be forgotten
from now on. No additional tokens are permitted on the
directive line after name.
#ident "string"
Put string into the .comment section of an object file.
#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 and -Y options above for
more detail. No additional tokens are permitted on the
directive line after the final " or >.
#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
from which it comes. If "filename" is not given, the
current file name is unchanged. No additional tokens
are premitted on the directive line after the optional
filename.
#endif
Ends a section of lines begun by a test directive (#if,
#ifdef, or #ifndef). Each test directive must have a
matching #endif. No additional tokens are permitted on
the directive line.
#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. No
additional tokens are permitted on the directive line
after name.
Page 3 (last mod. 8/20/87)
CPP(1) CPP(1)
ifndef name
The lines following will appear in the output if and
only if name has not been the subject of a previous
#define. No additional tokens are permitted on the
directive line after name.
#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,
the sizeof operator is not available.
To test whether either of two symbols, foo and fum, are
defined, use:
#if defined(foo) |defined(fum)
#elif constant-expression
An arbitrary number of #elif directives is allowed
between a #if, #ifdef, or #ifndef directive and a #else
or #endif directive. The lines following the #elif
directive will appear in the output if and only if the
preceding test directive evaluates to zero, all #elif
directives evaluate to zero, and the constant-
expression evaluates to non-zero. If constant-
expression evaluates to non-zero, all succeeding #elif
and #else directives will be ignored. Any constant-
expression allowed in a #if directive is allowed in a
#elif directive.
#else
The lines following will appear in the output if and
only 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.
The test directives and the possible #else directives can be
nested.
FILES
INCDIR standard directory list for #include files,
usually /usr/include
Page 4 (last mod. 8/20/87)
CPP(1) CPP(1)
LIBDIR usually /usr/lib
SEE ALSO
cc(1), line(1), m4(1)
ORIGIN
MIPS Computer Systems
Page 5 (last mod. 8/20/87)