Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ cpp(1) — 4D1 2.0

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

cc(1)

line(1)

m4(1)



     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)



Typewritten Software • bear@typewritten.org • Edmonds, WA 98026