aboutsummaryrefslogtreecommitdiff
path: root/gcc-1.40/cpp.info-2
diff options
context:
space:
mode:
authorAndrew Lee <alee14498@protonmail.com>2021-08-15 00:34:05 -0400
committerAndrew Lee <alee14498@protonmail.com>2021-08-15 00:34:05 -0400
commit60cc83bf91bfc9bb02f6304b5d6c8234ba6d210f (patch)
treefdc0be85a1ca35e34c3ae2c805fe9b718e3c1091 /gcc-1.40/cpp.info-2
parentdd8dfab51b832a654365ed00c06bf802ff628bfa (diff)
downloadlinux-0.01-distro-60cc83bf91bfc9bb02f6304b5d6c8234ba6d210f.tar.gz
linux-0.01-distro-60cc83bf91bfc9bb02f6304b5d6c8234ba6d210f.tar.bz2
linux-0.01-distro-60cc83bf91bfc9bb02f6304b5d6c8234ba6d210f.zip
Added gccHEADmaster
Diffstat (limited to 'gcc-1.40/cpp.info-2')
-rw-r--r--gcc-1.40/cpp.info-2881
1 files changed, 881 insertions, 0 deletions
diff --git a/gcc-1.40/cpp.info-2 b/gcc-1.40/cpp.info-2
new file mode 100644
index 0000000..1da8e85
--- /dev/null
+++ b/gcc-1.40/cpp.info-2
@@ -0,0 +1,881 @@
+Info file cpp.info, produced by Makeinfo, -*- Text -*- from input
+file cpp.texinfo.
+
+This file documents the GNU C Preprocessor.
+
+Copyright (C) 1987, 1989 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the entire resulting derived work is distributed under the terms
+of a permission notice identical to this one.
+
+Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions.
+
+
+
+File: cpp.info, Node: Self-Reference, Next: Argument Prescan, Prev: Side Effects, Up: Macro Pitfalls
+
+Self-Referential Macros
+.......................
+
+ A "self-referential" macro is one whose name appears in its definition.
+A special feature of ANSI Standard C is that the self-reference is
+not considered a macro call. It is passed into the preprocessor
+output unchanged.
+
+Let's consider an example:
+
+ #define foo (4 + foo)
+
+where `foo' is also a variable in your program.
+
+Following the ordinary rules, each reference to `foo' will expand
+into `(4 + foo)'; then this will be rescanned and will expand into
+`(4 + (4 + foo))'; and so on until it causes a fatal error (memory
+full) in the preprocessor.
+
+However, the special rule about self-reference cuts this process
+short after one step, at `(4 + foo)'. Therefore, this macro
+definition has the possibly useful effect of causing the program to
+add 4 to the value of `foo' wherever `foo' is referred to.
+
+In most cases, it is a bad idea to take advantage of this feature. A
+person reading the program who sees that `foo' is a variable will not
+expect that it is a macro as well. The reader will come across the
+identifier `foo' in the program and think its value should be that of
+the variable `foo', whereas in fact the value is four greater.
+
+The special rule for self-reference applies also to "indirect"
+self-reference. This is the case where a macro X expands to use a
+macro `y', and `y''s expansion refers to the macro `x'. The
+resulting reference to `x' comes indirectly from the expansion of
+`x', so it is a self-reference and is not further expanded. Thus,
+after
+
+ #define x (4 + y)
+ #define y (2 * x)
+
+`x' would expand into `(4 + (2 * x))'. Clear?
+
+But suppose `y' is used elsewhere, not from the definition of `x'.
+Then the use of `x' in the expansion of `y' is not a self-reference
+because `x' is not "in progress". So it does expand. However, the
+expansion of `x' contains a reference to `y', and that is an indirect
+self-reference now because `y' is "in progress". The result is that
+`y' expands to `(2 * (4 + y))'.
+
+It is not clear that this behavior would ever be useful, but it is
+specified by the ANSI C standard, so you need to understand it.
+
+
+
+File: cpp.info, Node: Argument Prescan, Next: Cascaded Macros, Prev: Self-Reference, Up: Macro Pitfalls
+
+Separate Expansion of Macro Arguments
+.....................................
+
+ We have explained that the expansion of a macro, including the
+substituted actual arguments, is scanned over again for macro calls
+to be expanded.
+
+What really happens is more subtle: first each actual argument text
+is scanned separately for macro calls. Then the results of this are
+substituted into the macro body to produce the macro expansion, and
+the macro expansion is scanned again for macros to expand.
+
+The result is that the actual arguments are scanned *twice* to expand
+macro calls in them.
+
+Most of the time, this has no effect. If the actual argument
+contained any macro calls, they are expanded during the first scan.
+The result therefore contains no macro calls, so the second scan does
+not change it. If the actual argument were substituted as given,
+with no prescan, the single remaining scan would find the same macro
+calls and produce the same results.
+
+You might expect the double scan to change the results when a
+self-referential macro is used in an actual argument of another macro
+(*note Self-Reference::.): the self-referential macro would be
+expanded once in the first scan, and a second time in the second
+scan. But this is not what happens. The self-references that do not
+expand in the first scan are marked so that they will not expand in
+the second scan either.
+
+The prescan is not done when an argument is stringified or
+concatenated. Thus,
+
+ #define str(s) #s
+ #define foo 4
+ str (foo)
+
+expands to `"foo"'. Once more, prescan has been prevented from
+having any noticeable effect.
+
+More precisely, stringification and concatenation use the argument as
+written, in un-prescanned form. The same actual argument would be
+used in prescanned form if it is substituted elsewhere without
+stringification or concatenation.
+
+ #define str(s) #s lose(s)
+ #define foo 4
+ str (foo)
+
+expands to `"foo" lose(4)'.
+
+You might now ask, "Why mention the prescan, if it makes no difference?
+And why not skip it and make the preprocessor faster?" The answer is
+that the prescan does make a difference in three special cases:
+
+ * Nested calls to a macro.
+
+ * Macros that call other macros that stringify or concatenate.
+
+ * Macros whose expansions contain unshielded commas.
+
+We say that "nested" calls to a macro occur when a macro's actual
+argument contains a call to that very macro. For example, if `f' is
+a macro that expects one argument, `f (f (1))' is a nested pair of
+calls to `f'. The desired expansion is made by expanding `f (1)' and
+substituting that into the definition of `f'. The prescan causes the
+expected result to happen. Without the prescan, `f (1)' itself would
+be substituted as an actual argument, and the inner use of `f' would
+appear during the main scan as an indirect self-reference and would
+not be expanded. Here, the prescan cancels an undesirable side
+effect (in the medical, not computational, sense of the term) of the
+special rule for self-referential macros.
+
+But prescan causes trouble in certain other cases of nested macro
+calls. Here is an example:
+
+ #define foo a,b
+ #define bar(x) lose(x)
+ #define lose(x) (1 + (x))
+
+ bar(foo)
+
+We would like `bar(foo)' to turn into `(1 + (foo))', which would then
+turn into `(1 + (a,b))'. But instead, `bar(foo)' expands into
+`lose(a,b)', and you get an error because `lose' requires a single
+argument. In this case, the problem is easily solved by the same
+parentheses that ought to be used to prevent misnesting of arithmetic
+operations:
+
+ #define foo (a,b)
+ #define bar(x) lose((x))
+
+The problem is more serious when the operands of the macro are not
+expressions; for example, when they are statements. Then parentheses
+are unacceptable because they would make for invalid C code:
+
+ #define foo { int a, b; ... }
+
+In GNU C you can shield the commas using the `({...})' construct
+which turns a compound statement into an expression:
+
+ #define foo ({ int a, b; ... })
+
+Or you can rewrite the macro definition to avoid such commas:
+
+ #define foo { int a; int b; ... }
+
+There is also one case where prescan is useful. It is possible to
+use prescan to expand an argument and then stringify it--if you use
+two levels of macros. Let's add a new macro `xstr' to the example
+shown above:
+
+ #define xstr(s) str(s)
+ #define str(s) #s
+ #define foo 4
+ xstr (foo)
+
+This expands into `"4"', not `"foo"'. The reason for the difference
+is that the argument of `xstr' is expanded at prescan (because `xstr'
+does not specify stringification or concatenation of the argument).
+The result of prescan then forms the actual argument for `str'.
+`str' uses its argument without prescan because it performs
+stringification; but it cannot prevent or undo the prescanning
+already done by `xstr'.
+
+
+
+File: cpp.info, Node: Cascaded Macros, Prev: Argument Prescan, Up: Macro Pitfalls
+
+Cascaded Use of Macros
+......................
+
+ A "cascade" of macros is when one macro's body contains a reference
+to another macro. This is very common practice. For example,
+
+ #define BUFSIZE 1020
+ #define TABLESIZE BUFSIZE
+
+This is not at all the same as defining `TABLESIZE' to be `1020'.
+The `#define' for `TABLESIZE' uses exactly the body you specify--in
+this case, `BUFSIZE'--and does not check to see whether it too is the
+name of a macro.
+
+It's only when you *use* `TABLESIZE' that the result of its expansion
+is checked for more macro names.
+
+This makes a difference if you change the definition of `BUFSIZE' at
+some point in the source file. `TABLESIZE', defined as shown, will
+always expand using the definition of `BUFSIZE' that is currently in
+effect:
+
+ #define BUFSIZE 1020
+ #define TABLESIZE BUFSIZE
+ #undef BUFSIZE
+ #define BUFSIZE 37
+
+Now `TABLESIZE' expands (in two stages) to `37'.
+
+
+
+File: cpp.info, Node: Conditionals, Next: Combining Sources, Prev: Macros, Up: Top
+
+Conditionals
+============
+
+In a macro processor, a "conditional" is a command that allows a part
+of the program to be ignored during compilation, on some conditions.
+In the C preprocessor, a conditional can test either an arithmetic
+expression or whether a name is defined as a macro.
+
+A conditional in the C preprocessor resembles in some ways an `if'
+statement in C, but it is important to understand the difference
+between them. The condition in an `if' statement is tested during
+the execution of your program. Its purpose is to allow your program
+to behave differently from run to run, depending on the data it is
+operating on. The condition in a preprocessor conditional command is
+tested when your program is compiled. Its purpose is to allow
+different code to be included in the program depending on the
+situation at the time of compilation.
+
+* Menu:
+
+* Uses: Conditional Uses. What conditionals are for.
+* Syntax: Conditional Syntax. How conditionals are written.
+* Deletion: Deleted Code. Making code into a comment.
+* Macros: Conditionals-Macros. Why conditionals are used with macros.
+* Errors: #error Command. Detecting inconsistent compilation parameters.
+
+
+
+File: cpp.info, Node: Conditional Uses, Next: Conditional Syntax, Prev: Conditionals, Up: Conditionals
+
+Why Conditionals are Used
+-------------------------
+
+Generally there are three kinds of reason to use a conditional.
+
+ * A program may need to use different code depending on the
+ machine or operating system it is to run on. In some cases the
+ code for one operating system may be erroneous on another
+ operating system; for example, it might refer to library
+ routines that do not exist on the other system. When this
+ happens, it is not enough to avoid executing the invalid code:
+ merely having it in the program makes it impossible to link the
+ program and run it. With a preprocessor conditional, the
+ offending code can be effectively excised from the program when
+ it is not valid.
+
+ * You may want to be able to compile the same source file into two
+ different programs. Sometimes the difference between the
+ programs is that one makes frequent time-consuming consistency
+ checks on its intermediate data while the other does not.
+
+ * A conditional whose condition is always false is a good way to
+ exclude code from the program but keep it as a sort of comment
+ for future reference.
+
+Most simple programs that are intended to run on only one machine
+will not need to use preprocessor conditionals.
+
+
+
+File: cpp.info, Node: Conditional Syntax, Next: Deleted Code, Prev: Conditional Uses, Up: Conditionals
+
+Syntax of Conditionals
+----------------------
+
+A conditional in the C preprocessor begins with a "conditional
+command": `#if', `#ifdef' or `#ifndef'. *Note Conditionals-Macros::,
+for info on `#ifdef' and `#ifndef'; only `#if' is explained here.
+
+* Menu:
+
+* If: #if Command. Basic conditionals using `#if' and `#endif'.
+* Else: #else Command. Including some text if the condition fails.
+* Elif: #elif Command. Testing several alternative possibilities.
+
+
+
+File: cpp.info, Node: #if Command, Next: #else Command, Prev: Conditional Syntax, Up: Conditional Syntax
+
+The `#if' Command
+.................
+
+ The `#if' command in its simplest form consists of
+
+ #if EXPRESSION
+ CONTROLLED TEXT
+ #endif /* EXPRESSION */
+
+The comment following the `#endif' is not required, but it is a good
+practice because it helps people match the `#endif' to the
+corresponding `#if'. Such comments should always be used, except in
+short conditionals that are not nested. In fact, you can put
+anything at all after the `#endif' and it will be ignored by the GNU
+C preprocessor, but only comments are acceptable in ANSI Standard C.
+
+EXPRESSION is a C expression of integer type, subject to stringent
+restrictions. It may contain
+
+ * Integer constants, which are all regarded as `long' or `unsigned
+ long'.
+
+ * Character constants, which are interpreted according to the
+ character set and conventions of the machine and operating
+ system on which the preprocessor is running. The GNU C
+ preprocessor uses the C data type `char' for these character
+ constants; therefore, whether some character codes are negative
+ is determined by the C compiler used to compile the
+ preprocessor. If it treats `char' as signed, then character
+ codes large enough to set the sign bit will be considered
+ negative; otherwise, no character code is considered negative.
+
+ * Arithmetic operators for addition, subtraction, multiplication,
+ division, bitwise operations, shifts, comparisons, and `&&' and
+ `||'.
+
+ * Identifiers that are not macros, which are all treated as zero(!).
+
+ * Macro calls. All macro calls in the expression are expanded
+ before actual computation of the expression's value begins.
+
+Note that `sizeof' operators and `enum'-type values are not allowed.
+`enum'-type values, like all other identifiers that are not taken as
+macro calls and expanded, are treated as zero.
+
+The text inside of a conditional can include preprocessor commands.
+Then the commands inside the conditional are obeyed only if that
+branch of the conditional succeeds. The text can also contain other
+conditional groups. However, the `#if''s and `#endif''s must balance.
+
+
+
+File: cpp.info, Node: #else Command, Next: #elif Command, Prev: #if Command, Up: Conditional Syntax
+
+The `#else' Command
+...................
+
+ The `#else' command can be added to a conditional to provide
+alternative text to be used if the condition is false. This looks like
+
+ #if EXPRESSION
+ TEXT-IF-TRUE
+ #else /* Not EXPRESSION */
+ TEXT-IF-FALSE
+ #endif /* Not EXPRESSION */
+
+If EXPRESSION is nonzero, and the TEXT-IF-TRUE is considered
+included, then `#else' acts like a failing conditional and the
+TEXT-IF-FALSE is ignored. Contrariwise, if the `#if' conditional
+fails, the TEXT-IF-FALSE is considered included.
+
+
+
+File: cpp.info, Node: #elif Command, Prev: #else Command, Up: Conditional Syntax
+
+The `#elif' Command
+...................
+
+ One common case of nested conditionals is used to check for more than
+two possible alternatives. For example, you might have
+
+ #if X == 1
+ ...
+ #else /* X != 1 */
+ #if X == 2
+ ...
+ #else /* X != 2 */
+ ...
+ #endif /* X != 2 */
+ #endif /* X != 1 */
+
+Another conditional command, `#elif', allows this to be abbreviated
+as follows:
+
+ #if X == 1
+ ...
+ #elif X == 2
+ ...
+ #else /* X != 2 and X != 1*/
+ ...
+ #endif /* X != 2 and X != 1*/
+
+`#elif' stands for "else if". Like `#else', it goes in the middle of
+a `#if'-`#endif' pair and subdivides it; it does not require a
+matching `#endif' of its own. Like `#if', the `#elif' command
+includes an expression to be tested.
+
+The text following the `#elif' is processed only if the original
+`#if'-condition failed and the `#elif' condition succeeeds. More
+than one `#elif' can go in the same `#if'-`#endif' group. Then the
+text after each `#elif' is processed only if the `#elif' condition
+succeeds after the original `#if' and any previous `#elif''s within
+it have failed. `#else' is equivalent to `#elif 1', and `#else' is
+allowed after any number of `#elif''s, but `#elif' may not follow a
+`#else'.
+
+
+
+File: cpp.info, Node: Deleted Code, Next: Conditionals-Macros, Prev: Conditional Syntax, Up: Conditionals
+
+Keeping Deleted Code for Future Reference
+-----------------------------------------
+
+If you replace or delete a part of the program but want to keep the
+old code around as a comment for future reference, the easy way to do
+this is to put `#if 0' before it and `#endif' after it.
+
+This works even if the code being turned off contains conditionals,
+but they must be entire conditionals (balanced `#if' and `#endif').
+
+
+
+File: cpp.info, Node: Conditionals-Macros, Next: #error Command, Prev: Deleted Code, Up: Conditionals
+
+Conditionals and Macros
+-----------------------
+
+Conditionals are rarely useful except in connection with macros. A
+`#if' command whose expression uses no macros is equivalent to `#if
+1' or `#if 0'; you might as well determine which one, by computing
+the value of the expression yourself, and then simplify the program.
+But when the expression uses macros, its value can vary from
+compilation to compilation.
+
+For example, here is a conditional that tests the expression `BUFSIZE
+== 1020', where `BUFSIZE' must be a macro.
+
+ #if BUFSIZE == 1020
+ printf ("Large buffers!\n");
+ #endif /* BUFSIZE is large */
+
+The special operator `defined' may be used in `#if' expressions to
+test whether a certain name is defined as a macro. Either `defined
+NAME' or `defined (NAME)' is an expression whose value is 1 if NAME
+is defined as macro at the current point in the program, and 0
+otherwise. For the `defined' operator it makes no difference what
+the definition of the macro is; all that matters is whether there is
+a definition. Thus, for example,
+
+ #if defined (vax) || defined (ns16000)
+
+would include the following code if either of the names `vax' and
+`ns16000' is defined as a macro.
+
+If a macro is defined and later undefined with `#undef', subsequent
+use of the `defined' operator will return 0, because the name is no
+longer defined. If the macro is defined again with another
+`#define', `defined' will recommence returning 1.
+
+Conditionals that test just the definedness of one name are very
+common, so there are two special short conditional commands for this
+case. They are
+
+`#ifdef NAME'
+ is equivalent to `#if defined (NAME)'.
+
+`#ifndef NAME'
+ is equivalent to `#if ! defined (NAME)'.
+
+Macro definitions can vary between compilations for several reasons.
+
+ * Some macros are predefined on each kind of machine. For
+ example, on a Vax, the name `vax' is a predefined macro. On
+ other machines, it would not be defined.
+
+ * Many more macros are defined by system header files. Different
+ systems and machines define different macros, or give them
+ different values. It is useful to test these macros with
+ conditionals to avoid using a system feature on a machine where
+ it is not implemented.
+
+ * Macros are a common way of allowing users to customize a program
+ for different machines or applications. For example, the macro
+ `BUFSIZE' might be defined in a configuration file for your
+ program that is included as a header file in each source file.
+ You would use `BUFSIZE' in a preprocessor conditional in order
+ to generate different code depending on the chosen configuration.
+
+ * Macros can be defined or undefined with `-D' and `-U' command
+ options when you compile the program. You can arrange to
+ compile the same source file into two different programs by
+ choosing a macro name to specify which program you want, writing
+ conditionals to test whether or how this macro is defined, and
+ then controlling the state of the macro with compiler command
+ options. *Note Invocation::.
+
+
+
+File: cpp.info, Node: #error Command, Prev: Conditionals-Macros, Up: Conditionals
+
+The `#error' Command
+--------------------
+
+The command `#error' causes the preprocessor to report a fatal error.
+The rest of the line that follows `#error' is used as the error
+message.
+
+You would use `#error' inside of a conditional that detects a
+combination of parameters which you know the program does not
+properly support. For example, if you know that the program will not
+run properly on a Vax, you might write
+
+ #ifdef vax
+ #error Won't work on Vaxen. See comments at get_last_object.
+ #endif
+
+*Note Nonstandard Predefined::, for why this works.
+
+If you have several configuration parameters that must be set up by
+the installation in a consistent way, you can use conditionals to
+detect an inconsistency and report it with `#error'. For example,
+
+ #if HASH_TABLE_SIZE % 2 == 0 || HASH_TABLE_SIZE % 3 == 0 \
+ || HASH_TABLE_SIZE % 5 == 0
+ #error HASH_TABLE_SIZE should not be divisible by a small prime
+ #endif
+
+
+
+File: cpp.info, Node: Combining Sources, Next: Other Commands, Prev: Conditionals, Up: Top
+
+Combining Source Files
+======================
+
+One of the jobs of the C preprocessor is to inform the C compiler of
+where each line of C code came from: which source file and which line
+number.
+
+C code can come from multiple source files if you use `#include';
+both `#include' and the use of conditionals and macros can cause the
+line number of a line in the preprocessor output to be different from
+the line's number in the original source file. You will appreciate
+the value of making both the C compiler (in error messages) and
+symbolic debuggers such as GDB use the line numbers in your source
+file.
+
+The C preprocessor builds on this feature by offering a command by
+which you can control the feature explicitly. This is useful when a
+file for input to the C preprocessor is the output from another
+program such as the `bison' parser generator, which operates on
+another file that is the true source file. Parts of the output from
+`bison' are generated from scratch, other parts come from a standard
+parser file. The rest are copied nearly verbatim from the source
+file, but their line numbers in the `bison' output are not the same
+as their original line numbers. Naturally you would like compiler
+error messages and symbolic debuggers to know the original source
+file and line number of each line in the `bison' output.
+
+`bison' arranges this by writing `#line' commands into the output
+file. `#line' is a command that specifies the original line number
+and source file name for subsequent input in the current preprocessor
+input file. `#line' has three variants:
+
+`#line LINENUM'
+ Here LINENUM is a decimal integer constant. This specifies that
+ the line number of the following line of input, in its original
+ source file, was LINENUM.
+
+`#line LINENUM FILENAME'
+ Here LINENUM is a decimal integer constant and FILENAME is a
+ string constant. This specifies that the following line of
+ input came originally from source file FILENAME and its line
+ number there was LINENUM. Keep in mind that FILENAME is not
+ just a file name; it is surrounded by doublequote characters so
+ that it looks like a string constant.
+
+`#line ANYTHING ELSE'
+ ANYTHING ELSE is checked for macro calls, which are expanded.
+ The result should be a decimal integer constant followed
+ optionally by a string constant, as described above.
+
+`#line' commands alter the results of the `__FILE__' and `__LINE__'
+predefined macros from that point on. *Note Standard Predefined::.
+
+
+
+File: cpp.info, Node: Other Commands, Next: Output, Prev: Combining Sources, Up: Top
+
+Miscellaneous Preprocessor Commands
+===================================
+
+This section describes three additional preprocessor commands. They
+are not very useful, but are mentioned for completeness.
+
+The "null command" consists of a `#' followed by a Newline, with only
+whitespace (including comments) in between. A null command is
+understood as a preprocessor command but has no effect on the
+preprocessor output. The primary significance of the existence of
+the null command is that an input line consisting of just a `#' will
+produce no output, rather than a line of output containing just a
+`#'. Supposedly some old C programs contain such lines.
+
+The `#pragma' command is specified in the ANSI standard to have an
+arbitrary implementation-defined effect. In the GNU C preprocessor,
+`#pragma' commands are ignored, except for `#pragma once' (*note
+Once-Only::.).
+
+The `#ident' command is supported for compatibility with certain
+other systems. It is followed by a line of text. On certain
+systems, the text is copied into a special place in the object file;
+on most systems, the text is ignored and this directive has no effect.
+
+
+
+File: cpp.info, Node: Output, Next: Invocation, Prev: Other Commands, Up: Top
+
+C Preprocessor Output
+=====================
+
+The output from the C preprocessor looks much like the input, except
+that all preprocessor command lines have been replaced with blank
+lines and all comments with spaces. Whitespace within a line is not
+altered; however, a space is inserted after the expansions of most
+macro calls.
+
+Source file name and line number information is conveyed by lines of
+the form
+
+ # LINENUM FILENAME FLAG
+
+which are inserted as needed into the middle of the input (but never
+within a string or character constant). Such a line means that the
+following line originated in file FILENAME at line LINENUM.
+
+The third field, FLAG, may be a number, or may be absent. It is `1'
+for the beginning of a new source file, and `2' for return to an old
+source file at the end of an included file. It is absent otherwise.
+
+
+
+File: cpp.info, Node: Invocation, Next: Concept Index, Prev: Output, Up: Top
+
+Invoking the C Preprocessor
+===========================
+
+Most often when you use the C preprocessor you will not have to
+invoke it explicitly: the C compiler will do so automatically.
+However, the preprocessor is sometimes useful individually.
+
+The C preprocessor expects two file names as arguments, INFILE and
+OUTFILE. The preprocessor reads INFILE together with any other files
+it specifies with `#include'. All the output generated by the
+combined input files is written in OUTFILE.
+
+Either INFILE or OUTFILE may be `-', which as INFILE means to read
+from standard input and as OUTFILE means to write to standard output.
+Also, if OUTFILE or both file names are omitted, the standard output
+and standard input are used for the omitted file names.
+
+Here is a table of command options accepted by the C preprocessor.
+Most of them can also be given when compiling a C program; they are
+passed along automatically to the preprocessor when it is invoked by
+the compiler.
+
+`-P'
+ Inhibit generation of `#'-lines with line-number information in
+ the output from the preprocessor (*note Output::.). This might
+ be useful when running the preprocessor on something that is not
+ C code and will be sent to a program which might be confused by
+ the `#'-lines
+
+`-C'
+ Do not discard comments: pass them through to the output file.
+ Comments appearing in arguments of a macro call will be copied
+ to the output before the expansion of the macro call.
+
+`-trigraphs'
+ Process ANSI standard trigraph sequences. These are
+ three-character sequences, all starting with `??', that are
+ defined by ANSI C to stand for single characters. For example,
+ `??/' stands for `\', so `'??/n'' is a character constant for a
+ newline. Strictly speaking, the GNU C preprocessor does not
+ support all programs in ANSI Standard C unless `-trigraphs' is
+ used, but if you ever notice the difference it will be with
+ relief.
+
+ You don't want to know any more about trigraphs.
+
+`-pedantic'
+ Issue warnings required by the ANSI C standard in certain cases
+ such as when text other than a comment follows `#else' or
+ `#endif'.
+
+`-I DIRECTORY'
+ Add the directory DIRECTORY to the end of the list of
+ directories to be searched for header files (*note Include
+ Syntax::.). This can be used to override a system header file,
+ substituting your own version, since these directories are
+ searched before the system header file directories. If you use
+ more than one `-I' option, the directories are scanned in
+ left-to-right order; the standard system directories come after.
+
+`-I-'
+ Any directories specified with `-I' options before the `-I-'
+ option are searched only for the case of `#include "FILE"'; they
+ are not searched for `#include <FILE>'.
+
+ If additional directories are specified with `-I' options after
+ the `-I-', these directories are searched for all `#include'
+ directives.
+
+ In addition, the `-I-' option inhibits the use of the current
+ directory as the first search directory for `#include "FILE"'.
+ Therefore, the current directory is searched only if it is
+ requested explicitly with `-I.'. Specifying both `-I-' and
+ `-I.' allows you to control precisely which directories are
+ searched before the current one and which are searched after.
+
+`-nostdinc'
+ Do not search the standard system directories for header files.
+ Only the directories you have specified with `-I' options (and
+ the current directory, if appropriate) are searched.
+
+`-D NAME'
+ Predefine NAME as a macro, with definition `1'.
+
+`-D NAME=DEFINITION'
+ Predefine NAME as a macro, with definition DEFINITION. There
+ are no restrictions on the contents of DEFINITION, but if you
+ are invoking the preprocessor from a shell or shell-like program
+ you may need to use the shell's quoting syntax to protect
+ characters such as spaces that have a meaning in the shell syntax.
+
+`-U NAME'
+ Do not predefine NAME. If both `-U' and `-D' are specified for
+ one name, the `-U' beats the `-D' and the name is not predefined.
+
+`-undef'
+ Do not predefine any nonstandard macros.
+
+`-d'
+ Instead of outputting the result of preprocessing, output a list
+ of `#define' commands for all the macros defined during the
+ execution of the preprocessor.
+
+`-M'
+ Instead of outputting the result of preprocessing, output a rule
+ suitable for `make' describing the dependencies of the main
+ source file. The preprocessor outputs one `make' rule
+ containing the object file name for that source file, a colon,
+ and the names of all the included files. If there are many
+ included files then the rule is split into several lines using
+ `\'-newline.
+
+ This feature is used in automatic updating of makefiles.
+
+`-MM'
+ Like `-M' but mention only the files included with `#include
+ "FILE"'. System header files included with `#include <FILE>'
+ are omitted.
+
+`-i FILE'
+ Process FILE as input, discarding the resulting output, before
+ processing the regular input file. Because the output generated
+ from FILE is discarded, the only effect of `-i FILE' is to make
+ the macros defined in FILE available for use in the main input.
+
+
+
+File: cpp.info, Node: Concept Index, Next: Index, Prev: Invocation, Up: Top
+
+Concept Index
+*************
+
+* Menu:
+
+* cascaded macros: Cascaded Macros.
+* commands: Commands.
+* concatenation: Concatenation.
+* conditionals: Conditionals.
+* header file: Header Files.
+* line control: Combining Sources.
+* macro body uses macro: Cascaded Macros.
+* null command: Other Commands.
+* options: Invocation.
+* output format: Output.
+* predefined macros: Predefined.
+* preprocessor commands: Commands.
+* redefining macros: Redefining.
+* repeated inclusion: Once-Only.
+* self-reference: Self-Reference.
+* semicolons (after macro calls): Swallow Semicolon.
+* side effects (in macro arguments): Side Effects.
+* stringification: Stringification.
+* undefining macros: Undefining.
+* unsafe macros: Side Effects.
+
+
+
+
+File: cpp.info, Node: Index, Prev: Concept Index, Up: Top
+
+Index of Commands, Macros and Options
+*************************************
+
+* Menu:
+
+* #elif: #elif Command.
+* #else: #else Command.
+* #error: #error Command.
+* #ident: Other Commands.
+* #if: Conditional Syntax.
+* #ifdef: Conditionals-Macros.
+* #ifndef: Conditionals-Macros.
+* #include: Include Syntax.
+* #line: Combining Sources.
+* #pragma: Other Commands.
+* -C: Invocation.
+* -D: Invocation.
+* -I: Invocation.
+* -M: Invocation.
+* -MM: Invocation.
+* -P: Invocation.
+* -U: Invocation.
+* -d: Invocation.
+* -i: Invocation.
+* -pedantic: Invocation.
+* -trigraphs: Invocation.
+* -undef: Invocation.
+* BSD: Nonstandard Predefined.
+* M68020: Nonstandard Predefined.
+* __BASE_FILE__: Standard Predefined.
+* __DATE__: Standard Predefined.
+* __FILE__: Standard Predefined.
+* __LINE__: Standard Predefined.
+* __STDC__: Standard Predefined.
+* __TIME__: Standard Predefined.
+* defined: Conditionals-Macros.
+* m68k: Nonstandard Predefined.
+* mc68000: Nonstandard Predefined.
+* ns32000: Nonstandard Predefined.
+* pyr: Nonstandard Predefined.
+* sequent: Nonstandard Predefined.
+* sun: Nonstandard Predefined.
+* system header files: Header Uses.
+* unix: Nonstandard Predefined.
+* vax: Nonstandard Predefined.
+
+
+