Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

acc(1)

cc(1)

lint(1)

m4(1)



  cpp(1)                              CLIX                              cpp(1)



  NAME

    cpp - Runs the C language preprocessor

  SYNOPSIS

    LIBDIR/cpp [flag ... ] [ifile[ofile]]

  FLAGS

    -P           Preprocesses the input without producing the line control
                 information used by the next pass of the C compiler.

    -C           Passes all comments (except those found on cpp directive
                 lines).  By default, cpp strips C-style comments.

    -Uname       Removes any initial definition of name, where name is a
                 reserved symbol that is predefined by the particular
                 preprocessor.  The following is the current list of these
                 possibly reserved symbols.  On the AT&T, 3B2 and 3B5
                 Computers, unix, and one of u3b2 or u3b5 are defined.

                 operating system:
                        unix, dmert, gcos, ibm, os, tss

                 hardware:
                        interdata, pdp11, u370, u3b, u3b5, u3b2, u3b20d, vax

                 UNIX system variant:
                        RES, RT

                 lint:  lint

    -Dname
    -Dname=def   Defines name with value def as if by a #define directive.  If
                 no =def is given, name is defined with value 1.  The -D flag
                 has lower precedence than the -U flag.  That is, if the same
                 name is used in both a -U flag and a -D flag, the name is
                 undefined regardless of the order of the flags.

    -T           Forces cpp to use only the first eight characters to
                 distinguish preprocessor symbols and is included for backward
                 compatibility.

    -Idir        Changes 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 quotes (") are first searched for
                 in the directory of the file with the #include line, then in
                 directories named in -I flags, and last in directories on a
                 standard list.  For #include files whose names are enclosed



  2/94 - Intergraph Corporation                                              1






  cpp(1)                              CLIX                              cpp(1)



                 in angle brackets (<>), the directory of the file with the
                 #include line is not searched.

    -Ydir        Uses directory dir in place of the standard list of
                 directories when searching for #include files.

    -H           Displays, one per line on stderr, the pathnames of included
                 files.

  DESCRIPTION

    The C language preprocessor, cpp, is invoked as the first pass of any C
    compilation by the cc command.  The output of cpp is designed to be in a
    form which is 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 is
    modified to follow these changes.  Therefore, the use of cpp other than
    through the cc command is not suggested, since the functionality of cpp
    may someday be moved elsewhere.  See m4 for a general macro processor.

    The command cpp optionally accepts two filenames as arguments.  The ifile
    and ofile are respectively the input and output for the preprocessor.
    They default to stdin and stdout if not supplied.

    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 filename (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 a pound sign (#) in column 1.  Any
    number of blanks and tabs is allowed between the # and the directive.  The
    directives are as follows:

    #define name token-string
           Replaces subsequent instances of name with token-string.

    #define name(arg, ... ,arg) token-string
           Replaces 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 argument 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.  Notice
           that there can be no space between name and the (.

    #undef name
           Causes the definition of name (if any) to be forgotten from now on.
           No additional tokens are permitted on the directive line after
           name.



  2                                              Intergraph Corporation - 2/94






  cpp(1)                              CLIX                              cpp(1)



    #ident "string"
           Put string into the .comment section of an object file.

    #include "filename"
    #include <filename>
           Includes at this point the contents of filename (which is then run
           through cpp).  When the <filename> notation is used, filename is
           only searched for in the standard places.  See the -I and -Y flags
           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.  The 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 filename is unchanged.  No
           additional tokens are permitted 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 directive without being
           the subject of an intervening #undef directive.  No additional
           tokens are permitted on the directive line after name.

    #ifndef name:
           The lines following will appear in the output if and only if name
           has not been the subject of a previous #define directive.  No
           additional tokens are permitted on the directive line after name.

    #if constant-expression
           Lines following appear in the output if and only if the constant-
           expression evaluates to nonzero.  All binary nonassignment 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 the following directive:

           #if defined(foo) || defined(fum)



  2/94 - Intergraph Corporation                                              3






  cpp(1)                              CLIX                              cpp(1)



    #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
           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.  Any constant-expression allowed in a #if directive is
           allowed in a #elif directive.

    #else  The lines following 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.

  EXAMPLES

    1.  Processes a C file into its expanded form:

        cpp myfile.c > myfile.cpp


    2.  Defines an identifier MY-ID to the preprocessor on the command line:

        cpp -DMY_ID myfile.c > myfile.cpp


    3.  Changes the include file search path to first search the directory
        /usr/src/myincludes:

        cpp -I/usr/src/myincludes myfile.c > myfile.cpp


  FILES

    INCDIR   Standard directory list for #include files.  Usually
             /usr/include.

    LIBDIR   Standard library files.  Usually /lib.

  NOTES

    The unsupported W flag enables the #class directive.  If it encounters a
    #class directive, cpp exits with code 27 after finishing all other
    processing.  This flag provides support for ``C with classes''.

    Because the standard directory for included files may be different in
    different environments, this form of #include directive should be used



  4                                              Intergraph Corporation - 2/94






  cpp(1)                              CLIX                              cpp(1)



    rather than one with an absolute path:

    #include <file.h>

    If an absolute path such as

    #include /usr/include/file.h

    is used, cpp warns about the use of the absolute pathname.

  DIAGNOSTICS

    The error messages produced by cpp are intended to be self-explanatory.
    The line number and filename where the error occurred are displayed along
    with the diagnostic.

  EXIT VALUES

    The cpp command returns a value of 27 if it encounters a #class directive.

  RELATED INFORMATION

    Commands:  acc(1), cc(1), lint(1), m4(1)































  2/94 - Intergraph Corporation                                              5




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