aboutsummaryrefslogtreecommitdiff
path: root/gcc-1.40/cpp.info-1
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-1
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-1')
-rw-r--r--gcc-1.40/cpp.info-11254
1 files changed, 1254 insertions, 0 deletions
diff --git a/gcc-1.40/cpp.info-1 b/gcc-1.40/cpp.info-1
new file mode 100644
index 0000000..7b07416
--- /dev/null
+++ b/gcc-1.40/cpp.info-1
@@ -0,0 +1,1254 @@
+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: Top, Next: Global Actions, Up: (DIR)
+
+The C Preprocessor
+******************
+
+The C preprocessor is a "macro processor" that is used automatically
+by the C compiler to transform your program before actual
+compilation. It is called a macro processor because it allows you to
+define "macros", which are brief abbreviations for longer constructs.
+
+The C preprocessor provides four separate facilities that you can use
+as you see fit:
+
+ * Inclusion of header files. These are files of declarations that
+ can be substituted into your program.
+
+ * Macro expansion. You can define "macros", which are
+ abbreviations for arbitrary fragments of C code, and then the C
+ preprocessor will replace the macros with their definitions
+ throughout the program.
+
+ * Conditional compilation. Using special preprocessor commands,
+ you can include or exclude parts of the program according to
+ various conditions.
+
+ * Line control. If you use a program to combine or rearrange
+ source files into an intermediate file which is then compiled,
+ you can use line control to inform the compiler of where each
+ source line originally came from.
+
+C preprocessors vary in some details. This manual discusses the GNU
+C preprocessor, the C Compatible Compiler Preprocessor. The GNU C
+preprocessor provides a superset of the features of ANSI Standard C.
+
+ANSI Standard C requires the rejection of many harmless constructs
+commonly used by today's C programs. Such incompatibility would be
+inconvenient for users, so the GNU C preprocessor is configured to
+accept these constructs by default. Strictly speaking, to get ANSI
+Standard C, you must use the options `-trigraphs', `-undef' and
+`-pedantic', but in practice the consequences of having strict ANSI
+Standard C make it undesirable to do this. *Note Invocation::.
+
+* Menu:
+
+* Global Actions:: Actions made uniformly on all input files.
+* Commands:: General syntax of preprocessor commands.
+* Header Files:: How and why to use header files.
+* Macros:: How and why to use macros.
+* Conditionals:: How and why to use conditionals.
+* Combining Sources:: Use of line control when you combine source files.
+* Other Commands:: Miscellaneous preprocessor commands.
+* Output:: Format of output from the C preprocessor.
+* Invocation:: How to invoke the preprocessor; command options.
+* Concept Index:: Index of concepts and terms.
+* Index:: Index of commands, predefined macros and options.
+
+
+
+File: cpp.info, Node: Global Actions, Next: Commands, Prev: Top, Up: Top
+
+Transformations Made Globally
+=============================
+
+Most C preprocessor features are inactive unless you give specific
+commands to request their use. (Preprocessor commands are lines
+starting with `#'; *note Commands::.). But there are three
+transformations that the preprocessor always makes on all the input
+it receives, even in the absence of commands.
+
+ * All C comments are replaced with single spaces.
+
+ * Backslash-Newline sequences are deleted, no matter where. This
+ feature allows you to break long lines for cosmetic purposes
+ without changing their meaning.
+
+ * Predefined macro names are replaced with their expansions (*note
+ Predefined::.).
+
+The first two transformations are done *before* nearly all other
+parsing and before preprocessor commands are recognized. Thus, for
+example, you can split a line cosmetically with Backslash-Newline
+anywhere (except when trigraphs are in use; see below).
+
+ /*
+ */ # /*
+ */ defi\
+ ne FO\
+ O 10\
+ 20
+
+is equivalent into `#define FOO 1020'. You can split even an escape
+sequence with Backslash-Newline. For example, you can split
+`"foo\bar"' between the `\' and the `b' to get
+
+ "foo\\
+ bar"
+
+This behavior is unclean: in all other contexts, a Backslash can be
+inserted in a string constant as an ordinary character by writing a
+double Backslash, and this creates an exception. But the ANSI C
+standard requires it. (Strict ANSI C does not allow Newlines in
+string constants, so they do not consider this a problem.)
+
+But there are a few exceptions to all three transformations.
+
+ * C comments and predefined macro names are not recognized inside
+ a `#include' command in which the file name is delimited with
+ `<' and `>'.
+
+ * C comments and predefined macro names are never recognized
+ within a character or string constant. (Strictly speaking, this
+ is the rule, not an exception, but it is worth noting here
+ anyway.)
+
+ * Backslash-Newline may not safely be used within an ANSI
+ "trigraph". Trigraphs are converted before Backslash-Newline is
+ deleted. If you write what looks like a trigraph with a
+ Backslash-Newline inside, the Backslash-Newline is deleted as
+ usual, but it is then too late to recognize the trigraph.
+
+ This exception is relevant only if you use the `-trigraphs'
+ option to enable trigraph processing. *Note Invocation::.
+
+
+
+File: cpp.info, Node: Commands, Next: Header Files, Prev: Global Actions, Up: Top
+
+Preprocessor Commands
+=====================
+
+Most preprocessor features are active only if you use preprocessor
+commands to request their use.
+
+Preprocessor commands are lines in your program that start with `#'.
+The `#' is followed by an identifier that is the "command name". For
+example, `#define' is the command that defines a macro. Whitespace
+is also allowed before and after the `#'.
+
+The set of valid command names is fixed. Programs cannot define new
+preprocessor commands.
+
+Some command names require arguments; these make up the rest of the
+command line and must be separated from the command name by
+whitespace. For example, `#define' must be followed by a macro name
+and the intended expansion of the macro.
+
+A preprocessor command cannot be more than one line in normal
+circumstances. It may be split cosmetically with Backslash-Newline,
+but that has no effect on its meaning. Comments containing Newlines
+can also divide the command into multiple lines, but the comments are
+changed to Spaces before the command is interpreted. The only way a
+significant Newline can occur in a preprocessor command is within a
+string constant or character constant. Note that most C compilers
+that might be applied to the output from the preprocessor do not
+accept string or character constants containing Newlines.
+
+The `#' and the command name cannot come from a macro expansion. For
+example, if `foo' is defined as a macro expanding to `define', that
+does not make `#foo' a valid preprocessor command.
+
+
+
+File: cpp.info, Node: Header Files, Next: Macros, Prev: Commands, Up: Top
+
+Header Files
+============
+
+A header file is a file containing C declarations and macro
+definitions (*note Macros::.) to be shared between several source
+files. You request the use of a header file in your program with the
+C preprocessor command `#include'.
+
+* Menu:
+
+* Header Uses:: What header files are used for.
+* Include Syntax:: How to write `#include' commands.
+* Include Operation:: What `#include' does.
+* Once-Only:: Preventing multiple inclusion of one header file.
+
+
+
+File: cpp.info, Node: Header Uses, Next: Include Syntax, Prev: Header Files, Up: Header Files
+
+Uses of Header Files
+--------------------
+
+Header files serve two kinds of purposes.
+
+ * System header files declare the interfaces to parts of the
+ operating system. You include them in your program to supply
+ the definitions you need to invoke system calls and libraries.
+
+ * Your own header files contain declarations for interfaces
+ between the source files of your program. Each time you have a
+ group of related declarations and macro definitions all or most
+ of which are needed in several different source files, it is a
+ good idea to create a header file for them.
+
+Including a header file produces the same results in C compilation as
+copying the header file into each source file that needs it. But
+such copying would be time-consuming and error-prone. With a header
+file, the related declarations appear in only one place. If they
+need to be changed, they can be changed in one place, and programs
+that include the header file will automatically use the new version
+when next recompiled. The header file eliminates the labor of
+finding and changing all the copies as well as the risk that a
+failure to find one copy will result in inconsistencies within a
+program.
+
+The usual convention is to give header files names that end with `.h'.
+
+
+
+File: cpp.info, Node: Include Syntax, Next: Include Operation, Prev: Header Uses, Up: Header Files
+
+The `#include' Command
+----------------------
+
+Both user and system header files are included using the preprocessor
+command `#include'. It has three variants:
+
+`#include <FILE>'
+ This variant is used for system header files. It searches for a
+ file named FILE in a list of directories specified by you, then
+ in a standard list of system directories. You specify
+ directories to search for header files with the command option
+ `-I' (*note Invocation::.). The option `-nostdinc' inhibits
+ searching the standard system directories; in this case only the
+ directories you specify are searched.
+
+ The parsing of this form of `#include' is slightly special
+ because comments are not recognized within the `<...>'. Thus,
+ in `#include <x/*y>' the `/*' does not start a comment and the
+ command specifies inclusion of a system header file named
+ `x/*y'. Of course, a header file with such a name is unlikely
+ to exist on Unix, where shell wildcard features would make it
+ hard to manipulate.
+
+ The argument FILE may not contain a `>' character. It may,
+ however, contain a `<' character.
+
+`#include "FILE"'
+ This variant is used for header files of your own program. It
+ searches for a file named FILE first in the current directory,
+ then in the same directories used for system header files. The
+ current directory is the directory of the current input file.
+ It is tried first because it is presumed to be the location of
+ the files that the current input file refers to. (If the `-I-'
+ option is used, the special treatment of the current directory
+ is inhibited.)
+
+ The argument FILE may not contain `"' characters. If
+ backslashes occur within FILE, they are considered ordinary text
+ characters, not escape characters. None of the character escape
+ sequences appropriate to string constants in C are processed.
+ Thus, `#include "x\n\\y"' specifies a filename containing three
+ backslashes. It is not clear why this behavior is ever useful,
+ but the ANSI standard specifies it.
+
+`#include ANYTHING ELSE'
+ This variant is called a "computed #include". Any `#include'
+ command whose argument does not fit the above two forms is a
+ computed include. The text ANYTHING ELSE is checked for macro
+ calls, which are expanded (*note Macros::.). When this is done,
+ the result must fit one of the above two variants.
+
+ This feature allows you to define a macro which controls the
+ file name to be used at a later point in the program. One
+ application of this is to allow a site-configuration file for
+ your program to specify the names of the system include files to
+ be used. This can help in porting the program to various
+ operating systems in which the necessary system header files are
+ found in different places.
+
+
+
+File: cpp.info, Node: Include Operation, Next: Once-Only, Prev: Include Syntax, Up: Header Files
+
+How `#include' Works
+--------------------
+
+The `#include' command works by directing the C preprocessor to scan
+the specified file as input before continuing with the rest of the
+current file. The output from the preprocessor contains the output
+already generated, followed by the output resulting from the included
+file, followed by the output that comes from the text after the
+`#include' command. For example, given two files as follows:
+
+ /* File program.c */
+ int x;
+ #include "header.h"
+
+ main ()
+ {
+ printf (test ());
+ }
+
+
+ /* File header.h */
+ char *test ();
+
+the output generated by the C preprocessor for `program.c' as input
+would be
+
+ int x;
+ char *test ();
+
+ main ()
+ {
+ printf (test ());
+ }
+
+Included files are not limited to declarations and macro definitions;
+they are merely the typical use. Any fragment of a C program can be
+included from another file. The include file could even contain the
+beginning of a statement that is concluded in the containing file, or
+the end of a statement that was started in the including file.
+However, a comment or a string or character constant may not start in
+the included file and finish in the including file. An unterminated
+comment, string constant or character constant in an included file is
+considered to end (with an error message) at the end of the file.
+
+The line following the `#include' command is always treated as a
+separate line by the C preprocessor even if the included file lacks a
+final newline.
+
+
+
+File: cpp.info, Node: Once-Only, Prev: Include Operation, Up: Header Files
+
+Once-Only Include Files
+-----------------------
+
+Very often, one header file includes another. It can easily result
+that a certain header file is included more than once. This may lead
+to errors, if the header file defines structure types or typedefs,
+and is certainly wasteful. Therefore, we often wish to prevent
+multiple inclusion of a header file.
+
+The standard way to do this is to enclose the entire real contents of
+the file in a conditional, like this:
+
+ #ifndef __FILE_FOO_SEEN__
+ #define __FILE_FOO_SEEN__
+
+ THE ENTIRE FILE
+
+ #endif /* __FILE_FOO_SEEN__ */
+
+The macro `__FILE_FOO_SEEN__' indicates that the file has been
+included once already; its name should begin with `__', and should
+contain the name of the file to avoid accidental conflicts.
+
+One drawback of this method is that the preprocessor must scan the
+input file completely in order to determine that all of it is to be
+ignored. This makes compilation slower. You can avoid the delay by
+inserting the following command near the beginning of file *in
+addition to the conditionals described above*:
+
+ #pragma once
+
+This command tells the GNU C preprocessor to ignore any future
+commands to include the same file (whichever file the `#pragma'
+appears in).
+
+You should not *rely* on `#pragma once' to prevent multiple inclusion
+of the file. It is just a hint, and a nonstandard one at that. Most
+C compilers will ignore it entirely. For this reason, you still need
+the conditionals if you want to make certain that the file's contents
+are not included twice.
+
+Note that `#pragma once' works by file name; if a file has more than
+one name, it can be included once under each name, even in GNU CC,
+despite `#pragma once'.
+
+
+
+File: cpp.info, Node: Macros, Next: Conditionals, Prev: Header Files, Up: Top
+
+Macros
+======
+
+A macro is a sort of abbreviation which you can define once and then
+use later. There are many complicated features associated with
+macros in the C preprocessor.
+
+* Menu:
+
+* Simple Macros:: Macros that always expand the same way.
+* Argument Macros:: Macros that accept arguments that are substituted
+ into the macro expansion.
+* Predefined:: Predefined macros that are always available.
+* Stringification:: Macro arguments converted into string constants.
+* Concatenation:: Building tokens from parts taken from macro arguments.
+* Undefining:: Cancelling a macro's definition.
+* Redefining:: Changing a macro's definition.
+* Macro Pitfalls:: Macros can confuse the unwary. Here we explain
+ several common problems and strange features.
+
+
+
+File: cpp.info, Node: Simple Macros, Next: Argument Macros, Prev: Macros, Up: Macros
+
+Simple Macros
+-------------
+
+A "simple macro" is a kind of abbreviation. It is a name which
+stands for a fragment of code.
+
+Before you can use a macro, you must "define" it explicitly with the
+`#define' command. `#define' is followed by the name of the macro
+and then the code it should be an abbreviation for. For example,
+
+ #define BUFFER_SIZE 1020
+
+defines a macro named `BUFFER_SIZE' as an abbreviation for the text
+`1020'. Therefore, if somewhere after this `#define' command there
+comes a C statement of the form
+
+ foo = (char *) xmalloc (BUFFER_SIZE);
+
+then the C preprocessor will recognize and "expand" the macro
+`BUFFER_SIZE', resulting in
+
+ foo = (char *) xmalloc (1020);
+
+the definition must be a single line; however, it may not end in the
+middle of a multi-line string constant or character constant.
+
+The use of all upper case for macro names is a standard convention.
+Programs are easier to read when it is possible to tell at a glance
+which names are macros.
+
+Normally, a macro definition must be a single line, like all C
+preprocessor commands. (You can split a long macro definition
+cosmetically with Backslash-Newline.) There is one exception:
+Newlines can be included in the macro definition if within a string
+or character constant. By the same token, it is not possible for a
+macro definition to contain an unbalanced quote character; the
+definition automatically extends to include the matching quote
+character that ends the string or character constant. Comments
+within a macro definition may contain Newlines, which make no
+difference since the comments are entirely replaced with Spaces
+regardless of their contents.
+
+Aside from the above, there is no restriction on what can go in a
+macro body. Parentheses need not balance. The body need not
+resemble valid C code. (Of course, you might get error messages from
+the C compiler when you use the macro.)
+
+The C preprocessor scans your program sequentially, so macro
+definitions take effect at the place you write them. Therefore, the
+following input to the C preprocessor
+
+ foo = X;
+ #define X 4
+ bar = X;
+
+produces as output
+
+ foo = X;
+
+ bar = 4;
+
+After the preprocessor expands a macro name, the macro's definition
+body is appended to the front of the remaining input, and the check
+for macro calls continues. Therefore, the macro body can contain
+calls to other macros. For example, after
+
+ #define BUFSIZE 1020
+ #define TABLESIZE BUFSIZE
+
+the name `TABLESIZE' when used in the program would go through two
+stages of expansion, resulting ultimately in `1020'.
+
+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. *Note
+Cascaded Macros::.
+
+
+
+File: cpp.info, Node: Argument Macros, Next: Predefined, Prev: Simple Macros, Up: Macros
+
+Macros with Arguments
+---------------------
+
+A simple macro always stands for exactly the same text, each time it
+is used. Macros can be more flexible when they accept "arguments".
+Arguments are fragments of code that you supply each time the macro
+is used. These fragments are included in the expansion of the macro
+according to the directions in the macro definition.
+
+To define a macro that uses arguments, you write a `#define' command
+with a list of "argument names" in parentheses after the name of the
+macro. The argument names may be any valid C identifiers, separated
+by commas and optionally whitespace. The open-parenthesis must
+follow the macro name immediately, with no space in between.
+
+For example, here is a macro that computes the minimum of two numeric
+values, as it is defined in many C programs:
+
+ #define min(X, Y) ((X) < (Y) ? (X) : (Y))
+
+(This is not the best way to define a "minimum" macro in GNU C.
+*Note Side Effects::, for more information.)
+
+To use a macro that expects arguments, you write the name of the
+macro followed by a list of "actual arguments" in parentheses.
+separated by commas. The number of actual arguments you give must
+match the number of arguments the macro expects. Examples of use of
+the macro `min' include `min (1, 2)' and `min (x + 28, *p)'.
+
+The expansion text of the macro depends on the arguments you use.
+Each of the argument names of the macro is replaced, throughout the
+macro definition, with the corresponding actual argument. Using the
+same macro `min' defined above, `min (1, 2)' expands into
+
+ ((1) < (2) ? (1) : (2))
+
+where `1' has been substituted for `X' and `2' for `Y'.
+
+Likewise, `min (x + 28, *p)' expands into
+
+ ((x + 28) < (*p) ? (x + 28) : (*p))
+
+Parentheses in the actual arguments must balance; a comma within
+parentheses does not end an argument. However, there is no
+requirement for brackets or braces to balance; thus, if you want to
+supply `array[x = y, x + 1]' as an argument, you must write it as
+`array[(x = y, x + 1)]', which is equivalent C code.
+
+After the actual arguments are substituted into the macro body, the
+entire result is appended to the front of the remaining input, and
+the check for macro calls continues. Therefore, the actual arguments
+can contain calls to other macros, either with or without arguments,
+or even to the same macro. The macro body can also contain calls to
+other macros. For example, `min (min (a, b), c)' expands into
+
+ ((((a) < (b) ? (a) : (b))) < (c)
+ ? (((a) < (b) ? (a) : (b)))
+ : (c))
+
+(Line breaks shown here for clarity would not actually be generated.)
+
+If you use the macro name followed by something other than an
+open-parenthesis (after ignoring any spaces, tabs and comments that
+follow), it is not a call to the macro, and the preprocessor leaves
+the name unaltered. Therefore, it is possible for the same name to
+be a variable or function in your program as well as a macro, and you
+can choose in each instance whether to refer to the macro (if an
+actual argument list follows) or the variable or function (if an
+argument list does not follow).
+
+Such dual use of one name could be confusing and should be avoided
+except when the two meanings are effectively synonymous: that is,
+when the name is both a macro and a function and the two have similar
+effects. You can think of the name simply as a function; use of the
+name for purposes other than calling it (such as, to take the
+address) will refer to the function, while calls will expand the
+macro and generate better but equivalent code. For example, you can
+use a function named `min' in the same source file that defines the
+macro. If you write `&min' with no argument list, you refer to the
+function. If you write `min (x, bb)', with an argument list, the
+macro is expanded. If you write `(min) (a, bb)', where the name
+`min' is not followed by an open-parenthesis, the macro is not
+expanded, so you wind up with a call to the function `min'.
+
+It is not allowed to define the same name as both a simple macro and
+a macro with arguments.
+
+In the definition of a macro with arguments, the list of argument
+names must follow the macro name immediately with no space in
+between. If there is a space after the macro name, the macro is
+defined as taking no arguments, and all the rest of the name is taken
+to be the expansion. The reason for this is that it is often useful
+to define a macro that takes no arguments and whose definition begins
+with an identifier in parentheses. This rule about spaces makes it
+possible for you to do either this:
+
+ #define FOO(x) - 1 / (x)
+
+(which defines `FOO' to take an argument and expand into minus the
+reciprocal of that argument) or this:
+
+ #define BAR (x) - 1 / (x)
+
+(which defines `BAR' to take no argument and always expand into `(x)
+- 1 / (x)').
+
+Note that the *uses* of a macro with arguments can have spaces before
+the left parenthesis; it's the *definition* where it matters whether
+there is a space.
+
+
+
+File: cpp.info, Node: Predefined, Next: Stringification, Prev: Argument Macros, Up: Macros
+
+Predefined Macros
+-----------------
+
+Several simple macros are predefined. You can use them without
+giving definitions for them. They fall into two classes: standard
+macros and system-specific macros.
+
+* Menu:
+
+* Standard Predefined:: Standard predefined macros.
+* Nonstandard Predefined:: Nonstandard predefined macros.
+
+
+
+File: cpp.info, Node: Standard Predefined, Next: Nonstandard Predefined, Prev: Predefined, Up: Predefined
+
+Standard Predefined Macros
+..........................
+
+ The standard predefined macros are available with the same meanings
+regardless of the machine or operating system on which you are using
+GNU C. Their names all start and end with double underscores. Those
+preceding `__GNUC__' in this table are standardized by ANSI C; the
+rest are GNU C extensions.
+
+`__FILE__'
+ This macro expands to the name of the current input file, in the
+ form of a C string constant.
+
+`__BASE_FILE__'
+ This macro expands to the name of the main input file, in the
+ form of a C string constant. This is the source file that was
+ specified as an argument when the C compiler was invoked.
+
+`__LINE__'
+ This macro expands to the current input line number, in the form
+ of a decimal integer constant. While we call it a predefined
+ macro, it's a pretty strange macro, since its "definition"
+ changes with each new line of source code.
+
+ This and `__FILE__' are useful in generating an error message to
+ report an inconsistency detected by the program; the message can
+ state the source line at which the inconsistency was detected.
+ For example,
+
+ fprintf (stderr, "Internal error: negative string length "
+ "%d at %s, line %d.",
+ length, __FILE__, __LINE__);
+
+ A `#include' command changes the expansions of `__FILE__' and
+ `__LINE__' to correspond to the included file. At the end of
+ that file, when processing resumes on the input file that
+ contained the `#include' command, the expansions of `__FILE__'
+ and `__LINE__' revert to the values they had before the
+ `#include' (but `__LINE__' is then incremented by one as
+ processing moves to the line after the `#include').
+
+ The expansions of both `__FILE__' and `__LINE__' are altered if
+ a `#line' command is used. *Note Combining Sources::.
+
+`__DATE__'
+ This macro expands to a string constant that describes the date
+ on which the preprocessor is being run. The string constant
+ contains eleven characters and looks like `"Jan 29 1987"' or
+ `"Apr 1 1905"'.
+
+`__TIME__'
+ This macro expands to a string constant that describes the time
+ at which the preprocessor is being run. The string constant
+ contains eight characters and looks like `"23:59:01"'.
+
+`__STDC__'
+ This macro expands to the constant 1, to signify that this is
+ ANSI Standard C. (Whether that is actually true depends on what
+ C compiler will operate on the output from the preprocessor.)
+
+`__GNUC__'
+ This macro is defined if and only if this is GNU C. This macro
+ is defined only when the entire GNU C compiler is in use; if you
+ invoke the preprocessor directly, `__GNUC__' is undefined.
+
+`__STRICT_ANSI__'
+ This macro is defined if and only if the `-ansi' switch was
+ specified when GNU C was invoked. Its definition is the null
+ string. This macro exists primarily to direct certain GNU
+ header files not to define certain traditional Unix constructs
+ which are incompatible with ANSI C.
+
+`__VERSION__'
+ This macro expands to a string which describes the version
+ number of GNU C. The string is normally a sequence of decimal
+ numbers separated by periods, such as `"1.18"'. The only
+ reasonable use of this macro is to incorporate it into a string
+ constant.
+
+`__OPTIMIZE__'
+ This macro is defined in optimizing compilations. It causes
+ certain GNU header files to define alternative macro definitions
+ for some system library functions. It is unwise to refer to or
+ test the definition of this macro unless you make very sure that
+ programs will execute with the same effect regardless.
+
+`__CHAR_UNSIGNED__'
+ This macro is defined if and only if the data type `char' is
+ unsigned on the target machine. It exists to cause the standard
+ header file `limit.h' to work correctly. It is bad practice to
+ refer to this macro yourself; instead, refer to the standard
+ macros defined in `limit.h'.
+
+
+
+File: cpp.info, Node: Nonstandard Predefined, Prev: Standard Predefined, Up: Predefined
+
+Nonstandard Predefined Macros
+.............................
+
+ The C preprocessor normally has several predefined macros that vary
+between machines because their purpose is to indicate what type of
+system and machine is in use. This manual, being for all systems and
+machines, cannot tell you exactly what their names are; instead, we
+offer a list of some typical ones.
+
+Some nonstandard predefined macros describe the operating system in
+use, with more or less specificity. For example,
+
+`unix'
+ `unix' is normally predefined on all Unix systems.
+
+`BSD'
+ `BSD' is predefined on recent versions of Berkeley Unix (perhaps
+ only in version 4.3).
+
+Other nonstandard predefined macros describe the kind of CPU, with
+more or less specificity. For example,
+
+`vax'
+ `vax' is predefined on Vax computers.
+
+`mc68000'
+ `mc68000' is predefined on most computers whose CPU is a
+ Motorola 68000, 68010 or 68020.
+
+`m68k'
+ `m68k' is also predefined on most computers whose CPU is a
+ 68000, 68010 or 68020; however, some makers use `mc68000' and
+ some use `m68k'. Some predefine both names. What happens in
+ GNU C depends on the system you are using it on.
+
+`M68020'
+ `M68020' has been observed to be predefined on some systems that
+ use 68020 CPUs--in addition to `mc68000' and `m68k' that are
+ less specific.
+
+`ns32000'
+ `ns32000' is predefined on computers which use the National
+ Semiconductor 32000 series CPU.
+
+Yet other nonstandard predefined macros describe the manufacturer of
+the system. For example,
+
+`sun'
+ `sun' is predefined on all models of Sun computers.
+
+`pyr'
+ `pyr' is predefined on all models of Pyramid computers.
+
+`sequent'
+ `sequent' is predefined on all models of Sequent computers.
+
+These predefined symbols are not only nonstandard, they are contrary
+to the ANSI standard because their names do not start with underscores.
+Therefore, the option `-ansi' inhibits the definition of these symbols.
+
+This tends to make `-ansi' useless, since many programs depend on the
+customary nonstandard predefined symbols. Even system header files
+check them and will generate incorrect declarations if they do not
+find the names that are expected. You might think that the header
+files supplied for the Uglix computer would not need to test what
+machine they are running on, because they can simply assume it is the
+Uglix; but often they do, and they do so using the customary names.
+As a result, very few C programs will compile with `-ansi'. We
+intend to avoid such problems on the GNU system.
+
+What, then, should you do in an ANSI C program to test the type of
+machine it is to run on?
+
+GNU C offers a parallel series of symbols for this purpose, whose
+names are made from the customary ones by adding `__' at the
+beginning and end. Thus, the symbol `__vax__' would be available on
+a vax, and so on.
+
+The set of nonstandard predefined names in the GNU C preprocessor is
+controlled by the macro `CPP_PREDEFINES', which should be a string
+containing `-D' options, separated by spaces. For example, on the
+Sun 3, we use the following definition:
+
+ #define CPP_PREDEFINES "-Dmc68000 -Dsun -Dunix -Dm68k"
+
+
+
+File: cpp.info, Node: Stringification, Next: Concatenation, Prev: Predefined, Up: Macros
+
+Stringification
+---------------
+
+"Stringification" means turning a code fragment into a string
+constant whose contents are the text for the code fragment. For
+example, stringifying `foo (z)' results in `"foo (z)"'.
+
+In the C preprocessor, stringification is an option available when
+macro arguments are substituted into the macro definition. In the
+body of the definition, when an argument name appears, the character
+`#' before the name specifies stringification of the corresponding
+actual argument when it is substituted at that point in the
+definition. The same argument may be substituted in other places in
+the definition without stringification if the argument name appears
+in those places with no `#'.
+
+Here is an example of a macro definition that uses stringification:
+
+ #define WARN_IF(EXP) \
+ do { if (EXP) fprintf (stderr, "Warning: " #EXP "\n"); } while (0)
+
+Here the actual argument for `EXP' is substituted once as given, into
+the `if' statement, and once as stringified, into the argument to
+`fprintf'. The `do' and `while (0)' are a kludge to make it possible
+to write `WARN_IF (ARG);', which the resemblance of `WARN_IF' to a
+function would make C programmers want to do; *note Swallow
+Semicolon::.).
+
+The stringification feature is limited to transforming one macro
+argument into one string constant: there is no way to combine the
+argument with other text and then stringify it all together. But the
+example above shows how an equivalent result can be obtained in ANSI
+Standard C using the feature that adjacent string constants are
+concatenated as one string constant. The preprocessor stringifies
+`EXP''s actual argument into a separate string constant, resulting in
+text like
+
+ do { if (x == 0) fprintf (stderr, "Warning: " "x == 0" "\n"); } while (0)
+
+but the C compiler then sees three consecutive string constants and
+concatenates them into one, producing effectively
+
+ do { if (x == 0) fprintf (stderr, "Warning: x == 0\n"); } while (0)
+
+Stringification in C involves more than putting doublequote
+characters around the fragment; it is necessary to put backslashes in
+front of all doublequote characters, and all backslashes in string
+and character constants, in order to get a valid C string constant
+with the proper contents. Thus, stringifying `p = "foo\n";' results
+in `"p = \"foo\\n\";"'. However, backslashes that are not inside of
+string or character constants are not duplicated: `\n' by itself
+stringifies to `"\n"'.
+
+Whitespace (including comments) in the text being stringified is
+handled according to precise rules. All leading and trailing
+whitespace is ignored. Any sequence of whitespace in the middle of
+the text is converted to a single space in the stringified result.
+
+
+
+File: cpp.info, Node: Concatenation, Next: Undefining, Prev: Stringification, Up: Macros
+
+Concatenation
+-------------
+
+"Concatenation" means joining two strings into one. In the context
+of macro expansion, concatenation refers to joining two lexical units
+into one longer one. Specifically, an actual argument to the macro
+can be concatenated with another actual argument or with fixed text
+to produce a longer name. The longer name might be the name of a
+function, variable or type, or a C keyword; it might even be the name
+of another macro, in which case it will be expanded.
+
+When you define a macro, you request concatenation with the special
+operator `##' in the macro body. When the macro is called, after
+actual arguments are substituted, all `##' operators are deleted, and
+so is any whitespace next to them (including whitespace that was part
+of an actual argument). The result is to concatenate the syntactic
+tokens on either side of the `##'.
+
+Consider a C program that interprets named commands. There probably
+needs to be a table of commands, perhaps an array of structures
+declared as follows:
+
+ struct command
+ {
+ char *name;
+ void (*function) ();
+ };
+
+ struct command commands[] =
+ {
+ { "quit", quit_command},
+ { "help", help_command},
+ ...
+ };
+
+It would be cleaner not to have to give each command name twice, once
+in the string constant and once in the function name. A macro which
+takes the name of a command as an argument can make this unnecessary.
+The string constant can be created with stringification, and the
+function name by concatenating the argument with `_command'. Here is
+how it is done:
+
+ #define COMMAND(NAME) { #NAME, NAME ## _command }
+
+ struct command commands[] =
+ {
+ COMMAND (quit),
+ COMMAND (help),
+ ...
+ };
+
+The usual case of concatenation is concatenating two names (or a name
+and a number) into a longer name. But this isn't the only valid
+case. It is also possible to concatenate two numbers (or a number
+and a name, such as `1.5' and `e3') into a number. Also,
+multi-character operators such as `+=' can be formed by
+concatenation. In some cases it is even possible to piece together a
+string constant. However, two pieces of text that don't together
+form a valid lexical unit cannot be concatenated. For example,
+concatenation with `x' on one side and `+' on the other is not
+meaningful because those two characters can't fit together in any
+lexical unit of C. The ANSI standard says that such attempts at
+concatenation are undefined, but in the GNU C preprocessor it is well
+defined: it puts the `x' and `+' side by side with no particular
+special results.
+
+Keep in mind that the C preprocessor converts comments to whitespace
+before macros are even considered. Therefore, you cannot create a
+comment by concatenating `/' and `*': the `/*' sequence that starts a
+comment is not a lexical unit, but rather the beginning of a "long"
+space character. Also, you can freely use comments next to a `##' in
+a macro definition, or in actual arguments that will be concatenated,
+because the comments will be converted to spaces at first sight, and
+concatenation will later discard the spaces.
+
+
+
+File: cpp.info, Node: Undefining, Next: Redefining, Prev: Concatenation, Up: Macros
+
+Undefining Macros
+-----------------
+
+To "undefine" a macro means to cancel its definition. This is done
+with the `#undef' command. `#undef' is followed by the macro name to
+be undefined.
+
+Like definition, undefinition occurs at a specific point in the
+source file, and it applies starting from that point. The name
+ceases to be a macro name, and from that point on it is treated by
+the preprocessor as if it had never been a macro name.
+
+For example,
+
+ #define FOO 4
+ x = FOO;
+ #undef FOO
+ x = FOO;
+
+expands into
+
+ x = 4;
+
+ x = FOO;
+
+In this example, `FOO' had better be a variable or function as well
+as (temporarily) a macro, in order for the result of the expansion to
+be valid C code.
+
+The same form of `#undef' command will cancel definitions with
+arguments or definitions that don't expect arguments. The `#undef'
+command has no effect when used on a name not currently defined as a
+macro.
+
+
+
+File: cpp.info, Node: Redefining, Next: Macro Pitfalls, Prev: Undefining, Up: Macros
+
+Redefining Macros
+-----------------
+
+"Redefining" a macro means defining (with `#define') a name that is
+already defined as a macro.
+
+A redefinition is trivial if the new definition is transparently
+identical to the old one. You probably wouldn't deliberately write a
+trivial redefinition, but they can happen automatically when a header
+file is included more than once (*note Header Files::.), so they are
+accepted silently and without effect.
+
+Nontrivial redefinition is considered likely to be an error, so it
+provokes a warning message from the preprocessor. However, sometimes
+it is useful to change the definition of a macro in mid-compilation.
+You can inhibit the warning by undefining the macro with `#undef'
+before the second definition.
+
+In order for a redefinition to be trivial, the new definition must
+exactly match the one already in effect, with two possible exceptions:
+
+ * Whitespace may be added or deleted at the beginning or the end.
+
+ * Whitespace may be changed in the middle (but not inside strings).
+ However, it may not be eliminated entirely, and it may not be
+ added where there was no whitespace at all.
+
+Recall that a comment counts as whitespace.
+
+
+
+File: cpp.info, Node: Macro Pitfalls, Prev: Redefining, Up: Macros
+
+Pitfalls and Subtleties of Macros
+---------------------------------
+
+In this section we describe some special rules that apply to macros
+and macro expansion, and point out certain cases in which the rules
+have counterintuitive consequences that you must watch out for.
+
+* Menu:
+
+* Misnesting:: Macros can contain unmatched parentheses.
+* Macro Parentheses:: Why apparently superfluous parentheses
+ may be necessary to avoid incorrect grouping.
+* Swallow Semicolon:: Macros that look like functions
+ but expand into compound statements.
+* Side Effects:: Unsafe macros that cause trouble when
+ arguments contain side effects.
+* Self-Reference:: Macros whose definitions use the macros' own names.
+* Argument Prescan:: Actual arguments are checked for macro calls
+ before they are substituted.
+* Cascaded Macros:: Macros whose definitions use other macros.
+
+
+
+File: cpp.info, Node: Misnesting, Next: Macro Parentheses, Prev: Macro Pitfalls, Up: Macro Pitfalls
+
+Improperly Nested Constructs
+............................
+
+ Recall that when a macro is called with arguments, the arguments are
+substituted into the macro body and the result is checked, together
+with the rest of the input file, for more macro calls.
+
+It is possible to piece together a macro call coming partially from
+the macro body and partially from the actual arguments. For example,
+
+ #define double(x) (2*(x))
+ #define call_with_1(x) x(1)
+
+would expand `call_with_1 (double)' into `(2*(1))'.
+
+Macro definitions do not have to have balanced parentheses. By
+writing an unbalanced open parenthesis in a macro body, it is
+possible to create a macro call that begins inside the macro body but
+ends outside of it. For example,
+
+ #define strange(file) fprintf (file, "%s %d",
+ ...
+ strange(stderr) p, 35)
+
+This bizarre example expands to `fprintf (stderr, "%s %d", p, 35)'!
+
+
+
+File: cpp.info, Node: Macro Parentheses, Next: Swallow Semicolon, Prev: Misnesting, Up: Macro Pitfalls
+
+Unintended Grouping of Arithmetic
+.................................
+
+ You may have noticed that in most of the macro definition examples
+shown above, each occurrence of a macro argument name had parentheses
+around it. In addition, another pair of parentheses usually surround
+the entire macro definition. Here is why it is best to write macros
+that way.
+
+Suppose you define a macro as follows,
+
+ #define ceil_div(x, y) (x + y - 1) / y
+
+whose purpose is to divide, rounding up. (One use for this operation
+is to compute how many `int''s are needed to hold a certain number of
+`char''s.) Then suppose it is used as follows:
+
+ a = ceil_div (b & c, sizeof (int));
+
+This expands into
+
+ a = (b & c + sizeof (int) - 1) / sizeof (int);
+
+which does not do what is intended. The operator-precedence rules of
+C make it equivalent to this:
+
+ a = (b & (c + sizeof (int) - 1)) / sizeof (int);
+
+But what we want is this:
+
+ a = ((b & c) + sizeof (int) - 1)) / sizeof (int);
+
+Defining the macro as
+
+ #define ceil_div(x, y) ((x) + (y) - 1) / (y)
+
+provides the desired result.
+
+However, unintended grouping can result in another way. Consider
+`sizeof ceil_div(1, 2)'. That has the appearance of a C expression
+that would compute the size of the type of `ceil_div (1, 2)', but in
+fact it means something very different. Here is what it expands to:
+
+ sizeof ((1) + (2) - 1) / (2)
+
+This would take the size of an integer and divide it by two. The
+precedence rules have put the division outside the `sizeof' when it
+was intended to be inside.
+
+Parentheses around the entire macro definition can prevent such
+problems. Here, then, is the recommended way to define `ceil_div':
+
+ #define ceil_div(x, y) (((x) + (y) - 1) / (y))
+
+
+
+File: cpp.info, Node: Swallow Semicolon, Next: Side Effects, Prev: Macro Parentheses, Up: Macro Pitfalls
+
+Swallowing the Semicolon
+........................
+
+ Often it is desirable to define a macro that expands into a compound
+statement. Consider, for example, the following macro, that advances
+a pointer (the argument `p' says where to find it) across whitespace
+characters:
+
+ #define SKIP_SPACES (p, limit) \
+ { register char *lim = (limit); \
+ while (p != lim) { \
+ if (*p++ != ' ') { \
+ p--; break; }}}
+
+Here Backslash-Newline is used to split the macro definition, which
+must be a single line, so that it resembles the way such C code would
+be laid out if not part of a macro definition.
+
+A call to this macro might be `SKIP_SPACES (p, lim)'. Strictly
+speaking, the call expands to a compound statement, which is a
+complete statement with no need for a semicolon to end it. But it
+looks like a function call. So it minimizes confusion if you can use
+it like a function call, writing a semicolon afterward, as in
+`SKIP_SPACES (p, lim);'
+
+But this can cause trouble before `else' statements, because the
+semicolon is actually a null statement. Suppose you write
+
+ if (*p != 0)
+ SKIP_SPACES (p, lim);
+ else ...
+
+ The presence of two statements--the compound statement and a null
+statement--in between the `if' condition and the `else' makes invalid
+C code.
+
+The definition of the macro `SKIP_SPACES' can be altered to solve
+this problem, using a `do ... while' statement. Here is how:
+
+ #define SKIP_SPACES (p, limit) \
+ do { register char *lim = (limit); \
+ while (p != lim) { \
+ if (*p++ != ' ') { \
+ p--; break; }}} \
+ while (0)
+
+Now `SKIP_SPACES (p, lim);' expands into
+
+ do {...} while (0);
+
+which is one statement.
+
+
+
+File: cpp.info, Node: Side Effects, Next: Self-Reference, Prev: Swallow Semicolon, Up: Macro Pitfalls
+
+Duplication of Side Effects
+...........................
+
+ Many C programs define a macro `min', for "minimum", like this:
+
+ #define min(X, Y) ((X) < (Y) ? (X) : (Y))
+
+When you use this macro with an argument containing a side effect, as
+shown here,
+
+ next = min (x + y, foo (z));
+
+it expands as follows:
+
+ next = ((x + y) < (foo (z)) ? (x + y) : (foo (z)));
+
+where `x + y' has been substituted for `X' and `foo (z)' for `Y'.
+
+The function `foo' is used only once in the statement as it appears
+in the program, but the expression `foo (z)' has been substituted
+twice into the macro expansion. As a result, `foo' might be called
+two times when the statement is executed. If it has side effects or
+if it takes a long time to compute, the results might not be what you
+intended. We say that `min' is an "unsafe" macro.
+
+The best solution to this problem is to define `min' in a way that
+computes the value of `foo (z)' only once. The C language offers no
+standard way to do this, but it can be done with GNU C extensions as
+follows:
+
+ #define min(X, Y) \
+ ({ typeof (X) __x = (X), __y = (Y); \
+ (__x < __y) ? __x : __y; })
+
+If you do not wish to use GNU C extensions, the only solution is to
+be careful when *using* the macro `min'. For example, you can
+calculate the value of `foo (z)', save it in a variable, and use that
+variable in `min':
+
+ #define min(X, Y) ((X) < (Y) ? (X) : (Y))
+ ...
+ {
+ int tem = foo (z);
+ next = min (x + y, tem);
+ }
+
+(where I assume that `foo' returns type `int').
+
+