mirror of
https://github.com/pmret/gcc-papermario.git
synced 2024-11-08 11:53:01 +01:00
1182 lines
49 KiB
Plaintext
1182 lines
49 KiB
Plaintext
|
This is Info file cpp.info, produced by Makeinfo version 1.67 from the
|
|||
|
input file cpp.texi.
|
|||
|
|
|||
|
This file documents the GNU C Preprocessor.
|
|||
|
|
|||
|
Copyright 1987, 1989, 1991, 1992, 1993, 1994, 1995 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 preprocessing directives,
|
|||
|
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::.
|
|||
|
|
|||
|
The C preprocessor is designed for C-like languages; you may run into
|
|||
|
problems if you apply it to other kinds of languages, because it assumes
|
|||
|
that it is dealing with C. For example, the C preprocessor sometimes
|
|||
|
outputs extra white space to avoid inadvertent C token concatenation,
|
|||
|
and this may cause problems with other languages.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Global Actions:: Actions made uniformly on all input files.
|
|||
|
* Directives:: General syntax of preprocessing directives.
|
|||
|
* 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 Directives:: Miscellaneous preprocessing directives.
|
|||
|
* 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 directives, predefined macros and options.
|
|||
|
|
|||
|
|
|||
|
File: cpp.info, Node: Global Actions, Next: Directives, Prev: Top, Up: Top
|
|||
|
|
|||
|
Transformations Made Globally
|
|||
|
=============================
|
|||
|
|
|||
|
Most C preprocessor features are inactive unless you give specific
|
|||
|
directives to request their use. (Preprocessing directives are lines
|
|||
|
starting with `#'; *note Directives::.). But there are three
|
|||
|
transformations that the preprocessor always makes on all the input it
|
|||
|
receives, even in the absence of directives.
|
|||
|
|
|||
|
* 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 preprocessing directives 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' directive 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: Directives, Next: Header Files, Prev: Global Actions, Up: Top
|
|||
|
|
|||
|
Preprocessing Directives
|
|||
|
========================
|
|||
|
|
|||
|
Most preprocessor features are active only if you use preprocessing
|
|||
|
directives to request their use.
|
|||
|
|
|||
|
Preprocessing directives are lines in your program that start with
|
|||
|
`#'. The `#' is followed by an identifier that is the "directive name".
|
|||
|
For example, `#define' is the directive that defines a macro.
|
|||
|
Whitespace is also allowed before and after the `#'.
|
|||
|
|
|||
|
The set of valid directive names is fixed. Programs cannot define
|
|||
|
new preprocessing directives.
|
|||
|
|
|||
|
Some directive names require arguments; these make up the rest of
|
|||
|
the directive line and must be separated from the directive name by
|
|||
|
whitespace. For example, `#define' must be followed by a macro name
|
|||
|
and the intended expansion of the macro. *Note Simple Macros::.
|
|||
|
|
|||
|
A preprocessing directive 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 directive into multiple lines, but the comments are
|
|||
|
changed to Spaces before the directive is interpreted. The only way a
|
|||
|
significant Newline can occur in a preprocessing directive 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 directive 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 preprocessing directive.
|
|||
|
|
|||
|
|
|||
|
File: cpp.info, Node: Header Files, Next: Macros, Prev: Directives, 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
|
|||
|
preprocessing directive `#include'.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Header Uses:: What header files are used for.
|
|||
|
* Include Syntax:: How to write `#include' directives.
|
|||
|
* Include Operation:: What `#include' does.
|
|||
|
* Once-Only:: Preventing multiple inclusion of one header file.
|
|||
|
* Inheritance:: Including one header file in another 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 and declarations 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'. Avoid unusual characters in header file names, as they reduce
|
|||
|
portability.
|
|||
|
|
|||
|
|
|||
|
File: cpp.info, Node: Include Syntax, Next: Include Operation, Prev: Header Uses, Up: Header Files
|
|||
|
|
|||
|
The `#include' Directive
|
|||
|
------------------------
|
|||
|
|
|||
|
Both user and system header files are included using the
|
|||
|
preprocessing directive `#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
|
|||
|
directive 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'
|
|||
|
directive 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--in particular,
|
|||
|
the expanded text must in the end be surrounded by either quotes
|
|||
|
or angle braces.
|
|||
|
|
|||
|
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-specific 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' directive 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' directive. For example, given a header file `header.h' as
|
|||
|
follows,
|
|||
|
|
|||
|
char *test ();
|
|||
|
|
|||
|
and a main program called `program.c' that uses the header file, like
|
|||
|
this,
|
|||
|
|
|||
|
int x;
|
|||
|
#include "header.h"
|
|||
|
|
|||
|
main ()
|
|||
|
{
|
|||
|
printf (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; those are merely the typical uses. 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.
|
|||
|
|
|||
|
It is possible for a header file to begin or end a syntactic unit
|
|||
|
such as a function definition, but that would be very confusing, so
|
|||
|
don't do it.
|
|||
|
|
|||
|
The line following the `#include' directive 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, Next: Inheritance, 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. In a user header file, the macro name should not begin
|
|||
|
with `_'. In a system header file, this name should begin with `__' to
|
|||
|
avoid conflicts with user programs. In any kind of header file, the
|
|||
|
macro name should contain the name of the file and some additional
|
|||
|
text, to avoid conflicts with other header files.
|
|||
|
|
|||
|
The GNU C preprocessor is programmed to notice when a header file
|
|||
|
uses this particular construct and handle it efficiently. If a header
|
|||
|
file is contained entirely in a `#ifndef' conditional, then it records
|
|||
|
that fact. If a subsequent `#include' specifies the same file, and the
|
|||
|
macro in the `#ifndef' is already defined, then the file is entirely
|
|||
|
skipped, without even reading it.
|
|||
|
|
|||
|
There is also an explicit directive to tell the preprocessor that it
|
|||
|
need not include a file more than once. This is called `#pragma once',
|
|||
|
and was used *in addition to* the `#ifndef' conditional around the
|
|||
|
contents of the header file. `#pragma once' is now obsolete and should
|
|||
|
not be used at all.
|
|||
|
|
|||
|
In the Objective C language, there is a variant of `#include' called
|
|||
|
`#import' which includes a file, but does so at most once. If you use
|
|||
|
`#import' *instead of* `#include', then you don't need the conditionals
|
|||
|
inside the header file to prevent multiple execution of the contents.
|
|||
|
|
|||
|
`#import' is obsolete because it is not a well designed feature. It
|
|||
|
requires the users of a header file--the applications programmers--to
|
|||
|
know that a certain header file should only be included once. It is
|
|||
|
much better for the header file's implementor to write the file so that
|
|||
|
users don't need to know this. Using `#ifndef' accomplishes this goal.
|
|||
|
|
|||
|
|
|||
|
File: cpp.info, Node: Inheritance, Prev: Once-Only, Up: Header Files
|
|||
|
|
|||
|
Inheritance and Header Files
|
|||
|
----------------------------
|
|||
|
|
|||
|
"Inheritance" is what happens when one object or file derives some
|
|||
|
of its contents by virtual copying from another object or file. In the
|
|||
|
case of C header files, inheritance means that one header file includes
|
|||
|
another header file and then replaces or adds something.
|
|||
|
|
|||
|
If the inheriting header file and the base header file have different
|
|||
|
names, then inheritance is straightforward: simply write `#include
|
|||
|
"BASE"' in the inheriting file.
|
|||
|
|
|||
|
Sometimes it is necessary to give the inheriting file the same name
|
|||
|
as the base file. This is less straightforward.
|
|||
|
|
|||
|
For example, suppose an application program uses the system header
|
|||
|
`sys/signal.h', but the version of `/usr/include/sys/signal.h' on a
|
|||
|
particular system doesn't do what the application program expects. It
|
|||
|
might be convenient to define a "local" version, perhaps under the name
|
|||
|
`/usr/local/include/sys/signal.h', to override or add to the one
|
|||
|
supplied by the system.
|
|||
|
|
|||
|
You can do this by compiling with the option `-I.', and writing a
|
|||
|
file `sys/signal.h' that does what the application program expects.
|
|||
|
But making this file include the standard `sys/signal.h' is not so
|
|||
|
easy--writing `#include <sys/signal.h>' in that file doesn't work,
|
|||
|
because it includes your own version of the file, not the standard
|
|||
|
system version. Used in that file itself, this leads to an infinite
|
|||
|
recursion and a fatal error in compilation.
|
|||
|
|
|||
|
`#include </usr/include/sys/signal.h>' would find the proper file,
|
|||
|
but that is not clean, since it makes an assumption about where the
|
|||
|
system header file is found. This is bad for maintenance, since it
|
|||
|
means that any change in where the system's header files are kept
|
|||
|
requires a change somewhere else.
|
|||
|
|
|||
|
The clean way to solve this problem is to use `#include_next', which
|
|||
|
means, "Include the *next* file with this name." This directive works
|
|||
|
like `#include' except in searching for the specified file: it starts
|
|||
|
searching the list of header file directories *after* the directory in
|
|||
|
which the current file was found.
|
|||
|
|
|||
|
Suppose you specify `-I /usr/local/include', and the list of
|
|||
|
directories to search also includes `/usr/include'; and suppose both
|
|||
|
directories contain `sys/signal.h'. Ordinary `#include <sys/signal.h>'
|
|||
|
finds the file under `/usr/local/include'. If that file contains
|
|||
|
`#include_next <sys/signal.h>', it starts searching after that
|
|||
|
directory, and finds the file in `/usr/include'.
|
|||
|
|
|||
|
|
|||
|
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. Some people refer to these as "manifest
|
|||
|
constants".
|
|||
|
|
|||
|
Before you can use a macro, you must "define" it explicitly with the
|
|||
|
`#define' directive. `#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'. If somewhere after this `#define' directive 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 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
|
|||
|
preprocessing directives. (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. This is because 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. (But if it does not, you may 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. A macro that
|
|||
|
accepts arguments is called a "function-like macro" because the syntax
|
|||
|
for using it looks like a function call.
|
|||
|
|
|||
|
To define a macro that uses arguments, you write a `#define'
|
|||
|
directive 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, and they do not prevent a comma from
|
|||
|
separating arguments. Thus,
|
|||
|
|
|||
|
macro (array[x = y, x + 1])
|
|||
|
|
|||
|
passes two arguments to `macro': `array[x = y' and `x + 1]'. 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 this text:
|
|||
|
|
|||
|
((((a) < (b) ? (a) : (b))) < (c)
|
|||
|
? (((a) < (b) ? (a) : (b)))
|
|||
|
: (c))
|
|||
|
|
|||
|
(Line breaks shown here for clarity would not actually be generated.)
|
|||
|
|
|||
|
If a macro `foo' takes one argument, and you want to supply an empty
|
|||
|
argument, you must write at least some whitespace between the
|
|||
|
parentheses, like this: `foo ( )'. Just `foo ()' is providing no
|
|||
|
arguments, which is an error if `foo' expects an argument. But `foo0
|
|||
|
()' is the correct way to call a macro defined to take zero arguments,
|
|||
|
like this:
|
|||
|
|
|||
|
#define foo0() ...
|
|||
|
|
|||
|
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 does not
|
|||
|
change what you have written. 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'.
|
|||
|
|
|||
|
You may not 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 line 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. The precise name returned is the one
|
|||
|
that was specified in `#include' or as the input file name
|
|||
|
argument.
|
|||
|
|
|||
|
`__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' directive 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' directive, 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' directive 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 `"Feb 1 1996"'.
|
|||
|
|
|||
|
`__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.)
|
|||
|
|
|||
|
On some hosts, system include files use a different convention,
|
|||
|
where `__STDC__' is normally 0, but is 1 if the user specifies
|
|||
|
strict conformance to the C Standard. The preprocessor follows
|
|||
|
the host convention when processing system include files, but when
|
|||
|
processing user files it follows the usual GNU C convention.
|
|||
|
|
|||
|
This macro is not defined if the `-traditional' option is used.
|
|||
|
|
|||
|
`__STDC_VERSION__'
|
|||
|
This macro expands to the C Standard's version number, a long
|
|||
|
integer constant of the form `YYYYMML' where YYYY and MM are the
|
|||
|
year and month of the Standard version. This signifies which
|
|||
|
version of the C Standard the preprocessor conforms to. Like
|
|||
|
`__STDC__', whether this version number is accurate for the entire
|
|||
|
implementation depends on what C compiler will operate on the
|
|||
|
output from the preprocessor.
|
|||
|
|
|||
|
This macro is not defined if the `-traditional' option is used.
|
|||
|
|
|||
|
`__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. The
|
|||
|
value identifies the major version number of GNU CC (`1' for GNU CC
|
|||
|
version 1, which is now obsolete, and `2' for version 2).
|
|||
|
|
|||
|
`__GNUC_MINOR__'
|
|||
|
The macro contains the minor version number of the compiler. This
|
|||
|
can be used to work around differences between different releases
|
|||
|
of the compiler (for example, if gcc 2.6.3 is known to support a
|
|||
|
feature, you can test for `__GNUC__ > 2 || (__GNUC__ == 2 &&
|
|||
|
__GNUC_MINOR__ >= 6)'). The last number, `3' in the example
|
|||
|
above, denotes the bugfix level of the compiler; no macro contains
|
|||
|
this value.
|
|||
|
|
|||
|
`__GNUG__'
|
|||
|
The GNU C compiler defines this when the compilation language is
|
|||
|
C++; use `__GNUG__' to distinguish between GNU C and GNU C++.
|
|||
|
|
|||
|
`__cplusplus'
|
|||
|
The draft ANSI standard for C++ used to require predefining this
|
|||
|
variable. Though it is no longer required, GNU C++ continues to
|
|||
|
define it, as do other popular C++ compilers. You can use
|
|||
|
`__cplusplus' to test whether a header is compiled by a C compiler
|
|||
|
or a C++ compiler.
|
|||
|
|
|||
|
`__STRICT_ANSI__'
|
|||
|
GNU C defines this macro 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.
|
|||
|
|
|||
|
`__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.
|
|||
|
|
|||
|
`__INCLUDE_LEVEL__'
|
|||
|
This macro expands to a decimal integer constant that represents
|
|||
|
the depth of nesting in include files. The value of this macro is
|
|||
|
incremented on every `#include' directive and decremented at every
|
|||
|
end of file. For input files specified by command line arguments,
|
|||
|
the nesting level is zero.
|
|||
|
|
|||
|
`__VERSION__'
|
|||
|
This macro expands to a string constant which describes the
|
|||
|
version number of GNU C. The string is normally a sequence of
|
|||
|
decimal numbers separated by periods, such as `"2.6.0"'.
|
|||
|
|
|||
|
`__OPTIMIZE__'
|
|||
|
GNU CC defines this macro in optimizing compilations. It causes
|
|||
|
certain GNU header files to define alternative macro definitions
|
|||
|
for some system library functions. You should not 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__'
|
|||
|
GNU C defines this macro if and only if the data type `char' is
|
|||
|
unsigned on the target machine. It exists to cause the standard
|
|||
|
header file `limits.h' to work correctly. You should not refer to
|
|||
|
this macro yourself; instead, refer to the standard macros defined
|
|||
|
in `limits.h'. The preprocessor uses this macro to determine
|
|||
|
whether or not to sign-extend large character constants written in
|
|||
|
octal; see *Note The `#if' Directive: #if Directive.
|
|||
|
|
|||
|
`__REGISTER_PREFIX__'
|
|||
|
This macro expands to a string (not a string constant) describing
|
|||
|
the prefix applied to CPU registers in assembler code. You can
|
|||
|
use it to write assembler code that is usable in multiple
|
|||
|
environments. For example, in the `m68k-aout' environment it
|
|||
|
expands to the null string, but in the `m68k-coff' environment it
|
|||
|
expands to the string `%'.
|
|||
|
|
|||
|
`__USER_LABEL_PREFIX__'
|
|||
|
Similar to `__REGISTER_PREFIX__', but describes the prefix applied
|
|||
|
to user generated labels in assembler code. For example, in the
|
|||
|
`m68k-aout' environment it expands to the string `_', but in the
|
|||
|
`m68k-coff' environment it expands to the null string. This does
|
|||
|
not work with the `-mno-underscores' option that the i386 OSF/rose
|
|||
|
and m88k targets provide nor with the `-mcall*' options of the
|
|||
|
rs6000 System V Release 4 target.
|
|||
|
|
|||
|
|
|||
|
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. You can use `cpp -dM' to see the
|
|||
|
values of predefined macros; see *Note Invocation::.
|
|||
|
|
|||
|
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', which are
|
|||
|
less specific.
|
|||
|
|
|||
|
`_AM29K'
|
|||
|
`_AM29000'
|
|||
|
Both `_AM29K' and `_AM29000' are predefined for the AMD 29000 CPU
|
|||
|
family.
|
|||
|
|
|||
|
`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 will 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 (when `cpp' is itself compiled) 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"
|
|||
|
|
|||
|
This macro is usually specified in `tm.h'.
|
|||
|
|
|||
|
|
|||
|
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; see *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 the
|
|||
|
actual value of `EXP' 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' directive. `#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' directive will cancel definitions with
|
|||
|
arguments or definitions that don't expect arguments. The `#undef'
|
|||
|
directive 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.
|
|||
|
|