COHERENT manpages

This page displays the COHERENT manpage for cpp [C preprocessor].

List of available manpages
Index


cpp -- Command

C preprocessor
/lib/cpp [option...] [file...]

The command  cpp calls the  C preprocessor to perform  C preprocessing.  It
performs  the operations  described in  section 3.8  of the  ANSI Standard;
these  include   file  inclusion,  conditional   code  selection,  constant
definition, and  macro definition.  See  the entry on C  preprocessor for a
full description of C's preprocessing language.

Normally, cpp  is used to  preprocess C programs,  but it can be  used as a
simple macro processor for other types  of files as well.  For example, the
X utility imake uses cpp to help build makefiles.

cpp reads each input file,  processes directives, and writes its product on
stdout.  If the  option -E  is not  used, cpp also  writes into  its output
statements of the form #linen filename, so the parser can connect its error
messages and debugger output with  the original line numbers in your source
files.

Options

cpp recognizes the following options:

-C   Do not  suppress comments.  Normally,  cpp strips all  comments from C
     code before it invokes the parsing phase, cc0.

-DVARIABLE[=value]
     Define VARIABLE for the preprocessor at compilation time.  If value is
     not defined, VARIABLE is set to one.  For example, the command

         cc -DLIMIT=20 foo.c

     tells the preprocessor  to define the variable LIMIT to  be 20.  The C
     preprocessor  acts  as  though the  directive  #define  LIMIT 20  were
     included in all source code.

-E   Strip all  line-number information from the  source code.  This option
     is used  to preprocess assembly-language  files or other  sources, and
     should not be used with the other compiler phases.

-Idirectory
     C  allows two  types  of #include  directives  in a  C program,  i.e.,
     #include "file.h" and #include <file.h>. The -I option tells cpp
     to search  a specific directory for  the files you have  named in your
     #include directives,  in addition to the  directories that it searches
     by default.  You can have more  than one -I option on your cpp command
     line.

-o file
     Write  output into  file. If  this option is  missing, cpp  writes its
     output onto stdout, which may be redirected.

-P   Strip all  file and line-number information from the  C code.  This is
     identical to the -E option, defined above.

-Q   Suppress all messages.

-UVARIABLE
     Undefine  VARIABLE, as  if an  #undef directive  were included  in the
     source  program.  This  is  used to  undefine the  variables that  cpp
     defines by default.

-V   Print verbose messages.

-VCPLUS
     Suppress C++-style online comments.

cpp reads the environmental variables CPPHEAD and CPPTAIL and appends their
contents to, respectively, the beginning and the end of the command cpp.

See Also

C preprocessor,
cc,
commands

Diagnostics

The following gives the error messages returned by cpp. The messages are in
alphabetical order.  Each is marked as  to whether it is a fatal, error, or
warning  condition.  A  fatal message  usually  indicates a  condition that
caused the  compiler to terminate  execution.  Fatal errors  from the later
phases of  compilation often cannot be fixed, and  may indicate problems in
the compiler or  assembler.  An error message points to  a condition in the
source code  that the compiler  cannot resolve.  This  almost always occurs
when the program does something illegal, e.g., has unbalanced braces.

string argument mismatch (error)
     The argument string does not match the type declared in the function's
     prototype.  Either  the function prototype  or the argument  should be
     changed.

#assert failure (error)
     The condition being tested in a #assert statement has failed.

## at beginning of macro (error)
     Macro replacement  lists may contain tokens that  are separated by ##,
     but ##  cannot appear at  the beginning or  the end of  the list.  The
     tokens on either side of the ## are pasted together into one token.

## at end of macro (error)
     Macro replacement  lists may contain tokens that  are separated by ##,
     but ##  cannot appear at  the beginning or  the end of  the list.  The
     tokens on either side of the ## are pasted together into one token.

string: cannot create (fatal)
     The preprocessor cpp cannot create  the output file string that it was
     asked  to create.   This often  is due  to a  problem with  the output
     device; check and make sure that it is not full and that it is working
     correctly.

string: cannot open (fatal)
     The compiler  cannot open the file  string of source code  that it was
     asked to  read.  cpp may not  have been told the  correct directory in
     which  this file  is  to be  found;  check that  the  file is  located
     correctly, and that the -I options, if any, are correct.

cannot open include file string (fatal)
     The program  asked for file  string, which was  not found in  the same
     directory as  the source  file, nor  in the default  include directory
     specified  by the  environmental variable  INCDIR, nor  in any  of the
     directories named in -I options given to the cc command.

conditional stack overflow (fatal)
     A series of #if expressions is nested so deeply that it overflowed the
     allotted stack space.  You should simplify this code.

#define argument mismatch (warning)
     The definition of an argument  in a #define instruction does not match
     its subsequent use.  One or the other should be changed.

#elif used without #if or #ifdef (error)
     An #elif  instruction must be  preceded by an #if,  #ifdef, or #ifndef
     control line.

#elif used after #else (error)
     An #elif instruction cannot be preceded by an #else instruction.

#else used without #if or #ifdef (error)
     An #else control  line must be preceded by an  #if, #ifdef, or #ifndef
     control line.

#endif used without #if or #ifdef (error)
     An #endif  instruction must be preceded by an  #if, #ifdef, or #ifndef
     instruction.

EOF in comment (fatal)
     Your source  file appears to  end in mid-comment.  The  file of source
     code may have  been truncated, or you failed to  close a comment; make
     sure  that each  open-comment symbol  `/*' is  balanced with  a close-
     comment symbol `*/'.

EOF in macro string invocation (error)
     Your source file appears to end  in a macro call.  The source file may
     be been truncated.

EOF in midline (warning)
     Check  to   see  that  your   source  file  has   not  been  truncated
     accidentally.

EOF in string (error)
     Your file  appears to end  in the middle  of a quoted  string literal.
     Check  to   see  that  your   source  file  has   not  been  truncated
     accidentally.

#error: string (fatal)
     An  #error control  line  has been  expanded,  printing the  remaining
     tokens on the line and terminating the program.

error in #define syntax (error)
     The syntax of a #define statement is incorrect.  See the Lexicon entry
     for #define for more information.

error in #include syntax (error)
     An #include directive must be  followed by a string enclosed by either
     quotation marks (`` '') or  angle brackets (<>).   Anything else
     is illegal.

identifier string has too many arguments (error)
     Too many actual parameters have been provided.

illegal control line (error)
     A `#' is followed by a word that the compiler does not recognize.

illegal cpp character (n decimal) (error)
     The character  noted cannot be processed  by cpp. It may  be a control
     character or a non-ASCII character.

illegal use of defined (error)
     The construction defined(token) or defined token is legal only in #if,
     #elif, or #assert expressions.

string in #if (error)
     A syntax  error occurred in  a #if declaration.   string describes the
     error in detail.

include stack overflow (fatal)
     A set  of #include  statements is nested  so deeply that  the allotted
     stack space  cannot hold  them.  Examines the  files for a  loop.  You
     should  try to  fold some  of the  header files  into one,  instead of
     having them call each other.

macro body too long (fatal)
     The size of the macro in  question exceeds the limit designed into the
     preprocessor.  Try to shorten or split the macro.

macro expansion buffer overflow in string (fatal)
     The  COHERENT  C  compiler  uses  a  static  buffer  space  to  expand
     preprocessor macros.  In some extreme cases, a macro will exhaust this
     space, thus causing the C compiler  to exit with this message.  Try to
     shorten the macro, or break it  up.  See the Lexicon entry for cpp for
     suggestions on how to use an alternative C preprocessor to expand huge
     macros.

macro string redefined (error)
     The program redefined the macro string.

macro string requires arguments (error)
     The macro calls for arguments that the program has not supplied.

macros nested number deep, loop likely (error)
     Macros  call  each  other number  times;  you  may have  inadvertently
     created an infinite loop.  Try to simplify the program.

missing #endif (error)
     An #if,  #ifdef, or #ifndef instruction was not  closed with an #endif
     instruction.

missing output file (fatal)
     The preprocessor cpp found a -o option that was not followed by a file
     name for the output file.

multiple #else's (error)
     An #if, #ifdef, or #ifndef expression  can be followed by no more than
     one #else expression.

nested comment (warning)
     The  comment  introducer  sequence `/*'  has  been  detected within  a
     comment.  Comments do not nest.

new line in string literal (error)
     A newline character appears in the middle of a string.  If you wish to
     embed a newline within a  string, use the character constant `\n'.  If
     you wish to continue the string  on a new line, insert a backslash `\'
     before the new line.

newline in macro argument (warning)
     A  macro  argument  contains a  newline  character.   This may  create
     trouble when the program is run.

out of space (fatal)
     The compiler ran out of space while attempting to compile the program.
     To remove  this error, examine your source and  break up any functions
     that are extraordinarily large.

parameter must follow # (error)
     Macro replacement  lists may contain  # followed by  a macro parameter
     name.  The macro argument is converted to a string literal.

preprocessor assertion failure (warning)
     A #assert directive that was  tested by the preprocessor cpp was found
     to be false.

string redefined (error)
     cpp macros should not be redefined.   You should check to see that you
     are  not #includeing  two  different versions  of a  file somehow,  or
     attempting to use the same macro name for two different purposes.

too many arguments in a macro (fatal)
     The program uses more than the allowed ten arguments with a macro.

too many directories in include list (fatal)
     The program uses more than the allowed ten #include directories.

string: unknown option (fatal)
     The preprocessor  cpp does  not recognize  the option string.  Try re-
     typing the cc command line.

Notes

The COHERENT  C compiler uses a static buffer  space to expand preprocessor
macros.   Some  programs  that  make  especially  intensive use  of  the  C
processor's macro facility may die during compilation with the message

    macro expansion buffer overflow

This means that the program  has exhaused the compiler's ability to process
macros.  You may  wish to use an alternative preprocessor,  such as the one
that comes with gcc, as described below.

The COHERENT C compiler combines  the preprocessor cpp with the parser cc0.
The file /lib/cpp is simply a  link to the C compiler /lib/cc0. Thus, there
is no way to specify an alternative version of the preprocessor through the
cc command.   You can get around, this however,  by linking the alternative
preprocessor  to a  file named  cc0 in  a directory  other than  /lib, then
calling the alternative version via cc. For example, to have gcc preprocess
program hugemacro.c, do  the following.  First, type the following commands
to link the gcc preprocess to a file named cc0:

    su root
    cd /usr/local/lib/gcc-lib/i386-coh/2.3.2
    ln cpp cc0

Then, to preprocess and compile hugemacro.c, type the following:

    cc -t0 -B/usr/local/lib/gcc-lib/i386-coh/2.3.2 -E hugemacro.c > tmp.c
    cc tmp.c
    rm tmp.c

You may  wish to  embed the above  into your makefile,  or write it  into a
shell script.