|
|
1.1 root 1: #
2: # @(#)README 1.3 3/24/84
3: #
4: August 30, 1982
5: Fixed by Kurt Shoens, UCB
6: If the "#line n name" occurs, then all future references
7: to the current file are generated in terms of "name", instead
8: of the name of file given to cpp in its command argument
9:
10: August 25, 1978
11:
12: Files in this directory form the C preprocessor, which handles '#include'
13: files and macro definition and expansion for the C compiler.
14: This new version was written by John F. Reiser and is from 5 to 12
15: times faster (on UNIX systems) than the old.
16:
17: To create the executable file 'cpp' in the current directory:
18: make
19:
20: To install the preprocessor 'cpp' so it will be used by the C compiler:
21: : safety first: backup the existing version
22: cp /lib/cpp /lib/ocpp
23: : install the new version
24: cp cpp /lib/cpp
25:
26: Invocation
27: cpp [-CEPRM] [-Dname] ... [-Dname=def] ... [-Idirectory] ...
28: [-Uname] ... [<infile>] [<outfile>]
29:
30: If there are two non-flag arguments then the first is the name of the
31: input file and the second is the name of the output file. If there is
32: one non-flag argument then it is the name of the input file and the
33: output is written on the standard output. If there are no non-flag
34: arguments then the input is taken from the standard input and the output
35: is written on the standard output. Flag arguments are:
36:
37: -C retain comments in output
38: -Dname define name as "1"
39: -Dname=def define name as def
40: -E ignored
41: -Idirectory add directory to search list for #include files
42: -M generate Makefile dependencies (-C and -M ignored)
43: -P don't insert lines "# 12 \"foo.c\"" into output
44: -R allow recursive macros
45: -Uname undefine name
46:
47: Documentation clarifications:
48: Symbols defined on the command line by "-Dfoo" are defined as "1",
49: i.e., as if they had been defined by "#define foo 1" or "-Dfoo=1".
50: The directory search order for #include files is
51: 1) the directory of the file which contains the #include request
52: (e.g. #include is relative to the file being scanned when
53: the request is made)
54: 2) the directories specified by -I, in left-to-right order
55: 3) the standard directory(s) (which for UNIX is /usr/include)
56: An unescaped linefeed (the single character "\n") terminates a
57: character constant or quoted string.
58: An escaped linefeed (the two-character sequence "\\\n") may be
59: used in the body of a '#define' statement to continue
60: the definition onto the next line. The escaped linefeed is
61: not included in the macro body.
62: Comments are uniformly removed (except if the argument -C is specified).
63: They are also ignored, except that a comment terminates a token.
64: Thus "foo/* la di da */bar" may expand 'foo' and 'bar' but
65: will never expand 'foobar'. If neither 'foo' nor 'bar' is a
66: macro then the output is "foobar", even if 'foobar'
67: is defined as something else. The file
68: #define foo(a,b)b/**/a
69: foo(1,2)
70: produces "21" because the comment causes a break which enables
71: the recognition of 'b' and 'a' as formals in the string "b/**/a".
72: Macro formal parameters are recognized in '#define' bodies even inside
73: character constants and quoted strings. The output from
74: #define foo(a) '\a'
75: foo(bar)
76: is the seven characters " '\\bar'". Macro names are not recognized
77: inside character constants or quoted strings during the regular scan.
78: Thus
79: #define foo bar
80: printf("foo");
81: does not expand 'foo' in the second line, because it is inside
82: a quoted string which is not part of a '#define' macro definition.
83: Macros are not expanded while processing a '#define' or '#undef'.
84: Thus
85: #define foo bletch
86: #define bar foo
87: #undef foo
88: bar
89: produces "foo". The token appearing immediately after a
90: '#ifdef' or '#ifndef' is not expanded (of course!).
91: Macros are not expanded during the scan which determines the actual
92: parameters to another macro call. Thus
93: #define foo(a,b)b a
94: #define bar hi
95: foo(bar,
96: #define bar bye
97: )
98: produces " bye" (and warns about the redefinition of 'bar').
99:
100: There are some differences between the new and the old preprocessor.
101: Bugs fixed:
102: "1.e4" is recognized as a floating-point number, rather than as an
103: opportunity to expand the possible macro name "e4".
104: Any kind and amount of white space (space, tab, linefeed, vertical tab,
105: formfeed, carriage return) is allowed between a macro name and
106: the left parenthesis which introduces its actual parameters.
107: The comma operator is legal in preprocessor '#if' statements.
108: Macros with parameters are legal in preprocessor '#if' statements.
109: Single-character character constants are legal in preprocessor '#if' statements.
110: Linefeeds are put out in the proper place when a multiline comment
111: is not passed through to the output.
112: The following example expands to "# # #" :
113: #define foo #
114: foo foo foo
115: If the -R flag is not specified then the invocation of some recursive
116: macros is trapped and the recursion forcibly terminated with an
117: error message. The recursions that are trapped are the ones
118: in which the nesting level is non-decreasing from some point on.
119: In particular,
120: #define a a
121: a
122: will be detected. (Use "#undef a" if that is what you want.)
123: The recursion
124: #define a c b
125: #define b c a
126: #define c foo
127: a
128: will not be detected because the nesting level decreases after
129: each expansion of "c".
130: The -R flag specifically allows recursive macros and recursion will
131: be strictly obeyed (to the extent that space is available).
132: Assuming that -R is specified:
133: #define a a
134: a
135: causes an infinite loop with very little output. The tail recursion
136: #define a <b
137: #define b >a
138: a
139: causes the string "<>" to be output infinitely many times. The
140: non-tail recursion
141: #define a b>
142: #define b a<
143: a
144: complains "too much pushback", dumps the pushback, and continues
145: (again, infinitely).
146:
147: Stylistic choice:
148: Nothing (not even linefeeds) is output while a false '#if', '#ifdef',
149: or '#ifndef' is in effect. Thus when all conditions become true
150: a line of the form "# 12345 \"foo.c\"" is output (unless -P).
151: Error and warning messages always appear on standard error (file
152: descriptor 2).
153: Mismatch between the number of formals and actuals in a macro call
154: produces only a warning, and not an error. Excess actuals
155: are ignored; missing actuals are turned into null strings.
156:
157: Incompatibility:
158: The virgule '/' in "a=/*b" is interpreted as the first character of
159: the pair "/*" which introduces a comment, rather than as the
160: second character of the divide-and-replace operator "=/".
161: This incompatibility reflects the recent change in the C language
162: which made "a/=*b" the legal way to write such a statement
163: if the meaning "a=a/ *b" is intended.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.