Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ cpp(1) — mips UMIPS RISC/os 5.01

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

cc(1)

as(1)

pc(1)

f77(1)

m4(1)



CPP(1)              RISC/os Reference Manual               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.

     -w   Tells cpp to not issue warning messages.

     -nestlevel=n
          Set the limit of nesting levels for #included files,
          default 50.

     -oldcomment
          Treat comments in old way by preprocessor, replace with
          nothing.  Default is to replace comments by a space.

     -Q   By default, cpp uses " (double quote) for the string
          literal in the __FILE__ expansions.  Specifying -Q
          option will cause cpp to use ' (single quotes) for the
          string literal in the __FILE__ expansion.  This option
          is asserted for PASCAL programs by pc(1).

     -Uname
          Remove any initial definition of name, where name is a
          reserved symbol that is predefined by the particular
          preprocessor.  If no name is specified, then the -U



                        Printed 11/19/92                   Page 1





CPP(1)              RISC/os Reference Manual               CPP(1)



          option is ignored.  The current list of these possibly
          reserved symbols includes:
               MIPSEB               in big endian mode
               MTPSEL               in little endian mode
               __STDC__=1           ANSI C
               LANGUAGE_C           when compiling a C program
               LANGUAGE_PASCAL      when compiling a PASCAL pro-
                                    gram
               LANGUAGE_FORTRAN     when compiling a FORTRAN pro-
                                    gram
               LANGUAGE_ASSEMBLY    when assembling a program
               LANGUAGE_PL1         when compiling a PL1 program
               LANGUAGE_COBOL       when compiling a COBOL pro-
                                    gram
               unix                 operating system
               mips                 target hardware
               host_mips            host hardware
               SYSTYPE_*            corresponding to the systype
               SYSTYPE_BSD          asserted for BSD host systems
               SYSTYPE_SYSV         asserted for SYSV host sys-
                                    tems

          None of these are defined by cpp. Instead, the compiler
          drivers, cc(1), as(1), pc(1), and f77(1) define these
          symbols.

          OTHERS
               operating system:    ibm, gcos, os, tss, dmert
               target hardware:     interdata, pdp11, u370, u3b,
                                    u3b5, u3b2, u3b20d, vax
               UNIX system variant: RES, RT
               lint(1):             lint

     -Dname
     -Dname=def
          Define name as if by a #define directive.  If no =def
          is given, name is defined as 1.  If no name is given
          the -D option is ignored.  The -D option has lower pre-
          cedence 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



 Page 2                 Printed 11/19/92





CPP(1)              RISC/os Reference Manual               CPP(1)



          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.
     Furthermore cpp reserves the names DATE and TIME for
     future use.

     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.

     #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



                        Printed 11/19/92                   Page 3





CPP(1)              RISC/os Reference Manual               CPP(1)



          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,
          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.

     #elif constant-expression



 Page 4                 Printed 11/19/92





CPP(1)              RISC/os Reference Manual               CPP(1)



          Similar to #else followed by #if, except does not
          introduce another conditional level.  The same restric-
          tions to the constant-expression for #if applies.
          Example:

               #if foo==4
               a="foo is four";
               #elif foo==2
               a="foo is two";
               #else
               a="foo is not four nor two";
               #endif

     The test directives and the possible #else directives can be
     nested.  Any number of #elif may occur between a test direc-
     tive and the corresponding #else or #endif.

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.





















                        Printed 11/19/92                   Page 5



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