184 lines
4.7 KiB
Groff
184 lines
4.7 KiB
Groff
.TH CPP VI
|
|
.SH NAME
|
|
cpp \- C Pre-Processor
|
|
.SH SYNOPSIS
|
|
cpp [\-options] files
|
|
.SH DESCRIPTION
|
|
.I Cpp
|
|
reads one or more files, expands macros and include
|
|
files, and writes an input file for the C compiler.
|
|
All output is to cpp.tmp (cpp.tmp.c on Unix).
|
|
.br
|
|
The following options are supported. On non-Unix systems,
|
|
options may be given in either case.
|
|
.IP -Ofile
|
|
Output to this file, instead of the default.
|
|
.IP -S
|
|
Output to stdout, instead of the default.
|
|
.IP -Idirectory
|
|
Add this directory to the list of
|
|
directories searched for #include "..." and #include <...>
|
|
commands. Note that there is no space between the
|
|
"-I" and the directory string. More than one -I command
|
|
is permitted.
|
|
.IP -L
|
|
.I Cpp
|
|
transmits line number information to
|
|
the C compiler by outputting "#line <number>" records.
|
|
If the -L option is given, this record will be transmitted
|
|
as "#", allowing the output of
|
|
.I cpp
|
|
to be input to a compiler
|
|
without an intervening preprocessor without error.
|
|
.IP -Dname=value
|
|
Define the name as if the programmer wrote
|
|
.br
|
|
.nf
|
|
#define name value
|
|
.fi
|
|
.br
|
|
at the start of the first file. If "=value" is not
|
|
given, a value of "1" will be used.
|
|
.br
|
|
On non-unix systems, all alphabetic text will be forced
|
|
to upper-case.
|
|
.br
|
|
.IP -Uname
|
|
Undefine the name as if
|
|
.br
|
|
.nf
|
|
#undef name
|
|
.fi
|
|
.br
|
|
were given. On non-Unix systems, "name" will be forced to
|
|
upper-case.
|
|
The following names are always available unless undefined:
|
|
.RS
|
|
.IP __FILE__
|
|
The input (or #include) file being compiled
|
|
(as a quoted string).
|
|
.IP __LINE__
|
|
The line number being compiled.
|
|
.IP __DATE__
|
|
The date and time of compilation as
|
|
a Unix ctime quoted string (the trailing newline is removed).
|
|
.RE
|
|
Thus,
|
|
.br
|
|
.nf
|
|
printf("Bug at line %s,", __LINE__);
|
|
printf(" source file %s", __FILE__);
|
|
printf(" compiled on %s", __DATE__);
|
|
.fi
|
|
.IP
|
|
-Xnumber
|
|
Enable debugging code. If no value is
|
|
given, a value of 1 will be used. (For maintenence of
|
|
.I cpp
|
|
only.)
|
|
.SH "COMMENTS IN MACRO TEXT AND ARGUMENT CONCATENATION"
|
|
.br
|
|
Comments are removed from the input text. The comment
|
|
characters serve as an invisible token delimiter. Thus,
|
|
the macro
|
|
.nf
|
|
#define CAT(a, b) b/**/a
|
|
int value = CAT(1, 2);
|
|
.fi
|
|
Will generate "int value = 21;".
|
|
.br
|
|
A better way of concatenating arguments is as follows:
|
|
.nf
|
|
#define I(x)x
|
|
#define CAT(x,y)I(x)y
|
|
int value = CAT(1, 2);
|
|
.fi
|
|
If the above macros are defined without extraneous
|
|
spaces, they will be transportable to other implementations.
|
|
.br
|
|
.SH DIFFERENCES
|
|
.br
|
|
The following is a list of differences between this
|
|
pre-processor and the Unix V7 preprocessor which was
|
|
written by John Reiser. It is probably not complete.
|
|
.IP o
|
|
Macro formal parameters are recognized within
|
|
quoted strings and character constants in macro definitions.
|
|
For example,
|
|
.nf
|
|
#define foo(a) "Today is a"
|
|
printf(foo(tuesday));
|
|
.fi
|
|
Would print "Today is tuesday".
|
|
.br
|
|
Recognition of formal parameters in macro replacement
|
|
strings is not permitted by the Draft ANSI C Standard.
|
|
It is permitted in this implementation if cpp was
|
|
compiled with the STRING_FORMAL parameter set appropriately.
|
|
.br
|
|
Unlike Reiser's implementation, the '\e' "quote next character"
|
|
does just that. I.e.
|
|
.nf
|
|
#define foo(a) "Today is \ea a"
|
|
printf(foo(tuesday));
|
|
.fi
|
|
Would print "Today is a tuesday". Note that this may
|
|
not be portable.
|
|
.IP o
|
|
Reiser's implementation removes "escaped" linefeeds
|
|
(The two character sequence \e<LF>) within macros. This
|
|
implementation preserves them. For example, a macro which
|
|
generates control commands might be written
|
|
.nf
|
|
#define foo(a, b) \e
|
|
#define a b \e
|
|
.fi
|
|
.nf
|
|
foo(fubar, foobar)
|
|
int fubar;
|
|
.fi
|
|
The above would generate "int foobar;" and a warning message.
|
|
Reiser's scan is slightly different.
|
|
.SH "ANSI C STANDARD"
|
|
.I Cpp
|
|
implements most of the ANSI draft standard.
|
|
You should be aware of the following:
|
|
.IP o
|
|
In the draft standard, the \en (backslash-newline)
|
|
character is "invisible" to all processing. In this implementation,
|
|
it is invisible to strings, but acts a "whitespace" (token-delimiter)
|
|
outside of strings. This considerably simplifies error
|
|
message handling.
|
|
.IP o
|
|
The following extensions to C are processed by cpp:
|
|
.nf
|
|
.sp 1
|
|
.ta 4n 27n
|
|
#elif expression (#else #if)
|
|
'\exNNN' (Hexadecimal constants)
|
|
'\ea' (Ascii BELL)
|
|
'\ev' (Ascii VT)
|
|
#if defined NAME (1 if defined, 0 if not)
|
|
#if defined (NAME) (1 if defined, 0 if not)
|
|
unary + (gag me with a spoon)
|
|
.fi
|
|
.IP o
|
|
The draft standard has extended C, adding a string
|
|
concatenation operator, where
|
|
.br
|
|
.nf
|
|
"foo" "bar"
|
|
.fi
|
|
.br
|
|
is regarded as the single string "foobar". It is not clear
|
|
from the draft standard whether this applies to pre-processing
|
|
if macro formals are recognized in strings.
|
|
.SH "ERROR MESSAGES"
|
|
.br
|
|
Many.
|
|
.br
|
|
.SH AUTHOR
|
|
.br
|
|
Martin Minow
|
|
.br
|