xref: /titanic_41/usr/src/lib/libpp/common/NOTES (revision 95efa359b507db290a2484b8f615822b1e06096f)
1C preprocessor features:
2
3(1)	The preprocessor is centered around the libpp.a  library.  This
4	library provides a tokenizing implementation of the preprocessing
5	stages of ANSI standard C.  The same library is used to construct
6	a standalone prepreprocessor as well as a C compiler front end
7	that, compiled with the library, eliminates the need for a
8	separate preprocessing pass.  Other C tools requiring C tokenizing
9	can use this library, providing a common interface to C language
10	tokens.
11
12(2)	The #pragma interface is exploited to allow the addition of new
13	directives and #pragma's without changing the preprocessor
14	executable.  Most implementation details can be specified by
15	directives in the file "ppdefault.h" that is automatically included
16	(by the standalone cpp library wrapper) as an initialization step.
17
18(3)	#assert, #unassert and corresponding #if predicate tests have been
19	added to relieve the conflicts introduced by predefined #define
20	macros (e.g., unix, vax, u3b, ...).  This is the same feature
21	present in the extended Reiser cpp that has been included in the
22	nmake distribution. (NOTE: #assert is a failed experiment)
23
24(4)	The implementation is sensitive to the incompatible differences
25	between the Reiser cpp (used by AT&T and BSD compilers) and the new
26	ANSI standard C.  A compatibility dialect implements Reiser
27	features, allowing for a smooth transition to the ANSI standard.
28
29(5)	To aid in the transition to ANSI, the preprocessor can do some
30	operations that would normally be done by the lexical analysis
31	stage of a compiler front end:
32
33	(a)	convert new-style character constants to a form
34		recognized by all current compilers
35
36	(b)	concatenate adjacent string literals
37
38(6)	The preprocessor can also warn about obsolete constructs used
39	in the compatibility dialect and on non-standard constructs
40	used in the ANSI dialect.  The latter is useful in writing
41	C code that is made to run through other implementations of
42	ANSI standard C.
43
44(7)	The preprocessor allows a C language implementor to take
45	advantage of local extensions without invalidating the
46	conformance of the C language implementation.
47
48C9X additions:
49
50(1)	#pragma STDC ...
51		special forms always accecpted
52
53(2)	_Pragma unary operator for pragmas via macro expansion
54		_Pragma(string-literal)
55			#pragma a b c
56			_Pragma("a b c")
57
58(3)	keywords
59		restrict inline _Bool _Complex _Imaginary
60
61(4)	macros
62		__STDC_VERSION__ 		199901L
63		__STDC_IEC_559__		1 or undef
64		__STDC_IEC_559_COMPLEX__	1 or udef
65		__STDC_ISO_10646__		yyyymmL
66
67(5)	empty arguments allowed in function-like macros
68
69(6)	variable arguments via ...
70		__VA_ARGS__ in replacement list only, expands to var args
71		only var args is ok (shall only appear in ...)
72
73(7)	hex floating constant with binary exponents
74		xxxxxx[pP]dddd
75
76(8)	// style comments
77
78(9)	universal characters, even in identifiers!
79		\uxxxx \Uxxxxxxxx
80
81(10)	LL ll ULL ull suffix for long long literals
82
83(11)	<stdarg.h> has va_copy()
84