| \input texinfo |
| @setfilename cpp.info |
| @settitle The C Preprocessor |
| |
| @ignore |
| @ifinfo |
| @format |
| START-INFO-DIR-ENTRY |
| * Cpp: (cpp). The C preprocessor. |
| END-INFO-DIR-ENTRY |
| @end format |
| @end ifinfo |
| @end ignore |
| |
| @c @smallbook |
| @c @cropmarks |
| @c @finalout |
| @setchapternewpage odd |
| @ifinfo |
| 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. |
| |
| @ignore |
| Permission is granted to process this file through Tex and print the |
| results, provided the printed document carries copying permission |
| notice identical to this one except for the removal of this paragraph |
| (this paragraph not being relevant to the printed manual). |
| |
| @end ignore |
| 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. |
| @end ifinfo |
| |
| @titlepage |
| @c @finalout |
| @title The C Preprocessor |
| @subtitle Last revised March 1997 |
| @subtitle for GCC version 2 |
| @author Richard M. Stallman |
| @page |
| @vskip 2pc |
| This booklet is eventually intended to form the first chapter of a GNU |
| C Language manual. |
| |
| @vskip 0pt plus 1filll |
| Copyright @copyright{} 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997 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. |
| @end titlepage |
| @page |
| |
| @node Top, Global Actions,, (DIR) |
| @chapter The C Preprocessor |
| |
| The C preprocessor is a @dfn{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 @dfn{macros}, |
| which are brief abbreviations for longer constructs. |
| |
| The C preprocessor provides four separate facilities that you can use as |
| you see fit: |
| |
| @itemize @bullet |
| @item |
| Inclusion of header files. These are files of declarations that can be |
| substituted into your program. |
| |
| @item |
| Macro expansion. You can define @dfn{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. |
| |
| @item |
| Conditional compilation. Using special preprocessing directives, you |
| can include or exclude parts of the program according to various |
| conditions. |
| |
| @item |
| 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. |
| @end itemize |
| |
| 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 @samp{-trigraphs}, @samp{-undef} and @samp{-pedantic}, but in |
| practice the consequences of having strict ANSI Standard C make it |
| undesirable to do this. @xref{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. |
| @end menu |
| |
| @node Global Actions, Directives, Top, Top |
| @section Transformations Made Globally |
| |
| Most C preprocessor features are inactive unless you give specific directives |
| to request their use. (Preprocessing directives are lines starting with |
| @samp{#}; @pxref{Directives}). But there are three transformations that the |
| preprocessor always makes on all the input it receives, even in the absence |
| of directives. |
| |
| @itemize @bullet |
| @item |
| All C comments are replaced with single spaces. |
| |
| @item |
| Backslash-Newline sequences are deleted, no matter where. This |
| feature allows you to break long lines for cosmetic purposes without |
| changing their meaning. |
| |
| @item |
| Predefined macro names are replaced with their expansions |
| (@pxref{Predefined}). |
| @end itemize |
| |
| The first two transformations are done @emph{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). |
| |
| @example |
| /* |
| */ # /* |
| */ defi\ |
| ne FO\ |
| O 10\ |
| 20 |
| @end example |
| |
| @noindent |
| is equivalent into @samp{#define FOO 1020}. You can split even an escape |
| sequence with Backslash-Newline. For example, you can split @code{"foo\bar"} |
| between the @samp{\} and the @samp{b} to get |
| |
| @example |
| "foo\\ |
| bar" |
| @end example |
| |
| @noindent |
| 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. |
| |
| @itemize @bullet |
| @item |
| C comments and predefined macro names are not recognized inside a |
| @samp{#include} directive in which the file name is delimited with |
| @samp{<} and @samp{>}. |
| |
| @item |
| 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.) |
| |
| @item |
| 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 @samp{-trigraphs} |
| option to enable trigraph processing. @xref{Invocation}. |
| @end itemize |
| |
| @node Directives, Header Files, Global Actions, Top |
| @section Preprocessing Directives |
| |
| @cindex preprocessing directives |
| @cindex 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 @samp{#}. |
| The @samp{#} is followed by an identifier that is the @dfn{directive name}. |
| For example, @samp{#define} is the directive that defines a macro. |
| Whitespace is also allowed before and after the @samp{#}. |
| |
| 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, |
| @samp{#define} must be followed by a macro name and the intended expansion |
| of the macro. @xref{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 @samp{#} and the directive name cannot come from a macro expansion. For |
| example, if @samp{foo} is defined as a macro expanding to @samp{define}, |
| that does not make @samp{#foo} a valid preprocessing directive. |
| |
| @node Header Files, Macros, Directives, Top |
| @section Header Files |
| |
| @cindex header file |
| A header file is a file containing C declarations and macro definitions |
| (@pxref{Macros}) to be shared between several source files. You request |
| the use of a header file in your program with the C preprocessing directive |
| @samp{#include}. |
| |
| @menu |
| * Header Uses:: What header files are used for. |
| * Include Syntax:: How to write @samp{#include} directives. |
| * Include Operation:: What @samp{#include} does. |
| * Once-Only:: Preventing multiple inclusion of one header file. |
| * Inheritance:: Including one header file in another header file. |
| @end menu |
| |
| @node Header Uses, Include Syntax, Header Files, Header Files |
| @subsection Uses of Header Files |
| |
| Header files serve two kinds of purposes. |
| |
| @itemize @bullet |
| @item |
| @findex system header files |
| 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. |
| |
| @item |
| 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. |
| @end itemize |
| |
| 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 |
| @file{.h}. Avoid unusual characters in header file names, as they |
| reduce portability. |
| |
| @node Include Syntax, Include Operation, Header Uses, Header Files |
| @subsection The @samp{#include} Directive |
| |
| @findex #include |
| Both user and system header files are included using the preprocessing |
| directive @samp{#include}. It has three variants: |
| |
| @table @code |
| @item #include <@var{file}> |
| This variant is used for system header files. It searches for a file |
| named @var{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 @samp{-I} |
| (@pxref{Invocation}). The option @samp{-nostdinc} inhibits searching |
| the standard system directories; in this case only the directories |
| you specify are searched. |
| |
| The parsing of this form of @samp{#include} is slightly special |
| because comments are not recognized within the @samp{<@dots{}>}. |
| Thus, in @samp{#include <x/*y>} the @samp{/*} does not start a comment |
| and the directive specifies inclusion of a system header file named |
| @file{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.@refill |
| |
| The argument @var{file} may not contain a @samp{>} character. It may, |
| however, contain a @samp{<} character. |
| |
| @item #include "@var{file}" |
| This variant is used for header files of your own program. It |
| searches for a file named @var{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 @samp{-I-} option is |
| used, the special treatment of the current directory is inhibited.) |
| |
| The argument @var{file} may not contain @samp{"} characters. If |
| backslashes occur within @var{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, |
| @samp{#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. |
| |
| @item #include @var{anything else} |
| @cindex computed @samp{#include} |
| This variant is called a @dfn{computed #include}. Any @samp{#include} |
| directive whose argument does not fit the above two forms is a computed |
| include. The text @var{anything else} is checked for macro calls, |
| which are expanded (@pxref{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. |
| @end table |
| |
| @node Include Operation, Once-Only, Include Syntax, Header Files |
| @subsection How @samp{#include} Works |
| |
| The @samp{#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 @samp{#include} |
| directive. For example, given a header file @file{header.h} as follows, |
| |
| @example |
| char *test (); |
| @end example |
| |
| @noindent |
| and a main program called @file{program.c} that uses the header file, |
| like this, |
| |
| @example |
| int x; |
| #include "header.h" |
| |
| main () |
| @{ |
| printf (test ()); |
| @} |
| @end example |
| |
| @noindent |
| the output generated by the C preprocessor for @file{program.c} as input |
| would be |
| |
| @example |
| int x; |
| char *test (); |
| |
| main () |
| @{ |
| printf (test ()); |
| @} |
| @end example |
| |
| 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 @samp{#include} directive is always treated as a |
| separate line by the C preprocessor even if the included file lacks a final |
| newline. |
| |
| @node Once-Only, Inheritance, Include Operation, Header Files |
| @subsection Once-Only Include Files |
| @cindex repeated inclusion |
| @cindex including just once |
| |
| 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: |
| |
| @example |
| #ifndef FILE_FOO_SEEN |
| #define FILE_FOO_SEEN |
| |
| @var{the entire file} |
| |
| #endif /* FILE_FOO_SEEN */ |
| @end example |
| |
| The macro @code{FILE_FOO_SEEN} indicates that the file has been included |
| once already. In a user header file, the macro name should not begin |
| with @samp{_}. In a system header file, this name should begin with |
| @samp{__} 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 @samp{#ifndef} conditional, then it records |
| that fact. If a subsequent @samp{#include} specifies the same file, |
| and the macro in the @samp{#ifndef} is already defined, then the file |
| is entirely skipped, without even reading it. |
| |
| @findex #pragma once |
| There is also an explicit directive to tell the preprocessor that it need |
| not include a file more than once. This is called @samp{#pragma once}, |
| and was used @emph{in addition to} the @samp{#ifndef} conditional around |
| the contents of the header file. @samp{#pragma once} is now obsolete |
| and should not be used at all. |
| |
| @findex #import |
| In the Objective C language, there is a variant of @samp{#include} |
| called @samp{#import} which includes a file, but does so at most once. |
| If you use @samp{#import} @emph{instead of} @samp{#include}, then you |
| don't need the conditionals inside the header file to prevent multiple |
| execution of the contents. |
| |
| @samp{#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 @samp{#ifndef} |
| accomplishes this goal. |
| |
| @node Inheritance,, Once-Only, Header Files |
| @subsection Inheritance and Header Files |
| @cindex inheritance |
| @cindex overriding a header file |
| |
| @dfn{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 @samp{#include |
| "@var{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 |
| @file{sys/signal.h}, but the version of @file{/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 @file{/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 @samp{-I.}, and |
| writing a file @file{sys/signal.h} that does what the application |
| program expects. But making this file include the standard |
| @file{sys/signal.h} is not so easy---writing @samp{#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. |
| |
| @samp{#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. |
| |
| @findex #include_next |
| The clean way to solve this problem is to use |
| @samp{#include_next}, which means, ``Include the @emph{next} file with |
| this name.'' This directive works like @samp{#include} except in |
| searching for the specified file: it starts searching the list of header |
| file directories @emph{after} the directory in which the current file |
| was found. |
| |
| Suppose you specify @samp{-I /usr/local/include}, and the list of |
| directories to search also includes @file{/usr/include}; and suppose |
| both directories contain @file{sys/signal.h}. Ordinary |
| @samp{#include <sys/signal.h>} finds the file under |
| @file{/usr/local/include}. If that file contains @samp{#include_next |
| <sys/signal.h>}, it starts searching after that directory, and finds the |
| file in @file{/usr/include}. |
| |
| @node Macros, Conditionals, Header Files, Top |
| @section 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. |
| @end menu |
| |
| @node Simple Macros, Argument Macros, Macros, Macros |
| @subsection Simple Macros |
| @cindex simple macro |
| @cindex manifest constant |
| |
| A @dfn{simple macro} is a kind of abbreviation. It is a name which |
| stands for a fragment of code. Some people refer to these as |
| @dfn{manifest constants}. |
| |
| Before you can use a macro, you must @dfn{define} it explicitly with the |
| @samp{#define} directive. @samp{#define} is followed by the name of the |
| macro and then the code it should be an abbreviation for. For example, |
| |
| @example |
| #define BUFFER_SIZE 1020 |
| @end example |
| |
| @noindent |
| defines a macro named @samp{BUFFER_SIZE} as an abbreviation for the text |
| @samp{1020}. If somewhere after this @samp{#define} directive there comes |
| a C statement of the form |
| |
| @example |
| foo = (char *) xmalloc (BUFFER_SIZE); |
| @end example |
| |
| @noindent |
| then the C preprocessor will recognize and @dfn{expand} the macro |
| @samp{BUFFER_SIZE}, resulting in |
| |
| @example |
| foo = (char *) xmalloc (1020); |
| @end example |
| |
| 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 |
| |
| @example |
| foo = X; |
| #define X 4 |
| bar = X; |
| @end example |
| |
| @noindent |
| produces as output |
| |
| @example |
| foo = X; |
| |
| bar = 4; |
| @end example |
| |
| 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 |
| |
| @example |
| #define BUFSIZE 1020 |
| #define TABLESIZE BUFSIZE |
| @end example |
| |
| @noindent |
| the name @samp{TABLESIZE} when used in the program would go through two |
| stages of expansion, resulting ultimately in @samp{1020}. |
| |
| This is not at all the same as defining @samp{TABLESIZE} to be @samp{1020}. |
| The @samp{#define} for @samp{TABLESIZE} uses exactly the body you |
| specify---in this case, @samp{BUFSIZE}---and does not check to see whether |
| it too is the name of a macro. It's only when you @emph{use} @samp{TABLESIZE} |
| that the result of its expansion is checked for more macro names. |
| @xref{Cascaded Macros}. |
| |
| @node Argument Macros, Predefined, Simple Macros, Macros |
| @subsection Macros with Arguments |
| @cindex macros with argument |
| @cindex arguments in macro definitions |
| @cindex function-like macro |
| |
| A simple macro always stands for exactly the same text, each time it is |
| used. Macros can be more flexible when they accept @dfn{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 @dfn{function-like macro} because the |
| syntax for using it looks like a function call. |
| |
| @findex #define |
| To define a macro that uses arguments, you write a @samp{#define} directive |
| with a list of @dfn{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: |
| |
| @example |
| #define min(X, Y) ((X) < (Y) ? (X) : (Y)) |
| @end example |
| |
| @noindent |
| (This is not the best way to define a ``minimum'' macro in GNU C@. |
| @xref{Side Effects}, for more information.) |
| |
| To use a macro that expects arguments, you write the name of the macro |
| followed by a list of @dfn{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 @samp{min} |
| include @samp{min (1, 2)} and @samp{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 @samp{min} defined above, @samp{min (1, 2)} expands into |
| |
| @example |
| ((1) < (2) ? (1) : (2)) |
| @end example |
| |
| @noindent |
| where @samp{1} has been substituted for @samp{X} and @samp{2} for @samp{Y}. |
| |
| Likewise, @samp{min (x + 28, *p)} expands into |
| |
| @example |
| ((x + 28) < (*p) ? (x + 28) : (*p)) |
| @end example |
| |
| 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, |
| |
| @example |
| macro (array[x = y, x + 1]) |
| @end example |
| |
| @noindent |
| passes two arguments to @code{macro}: @samp{array[x = y} and @samp{x + |
| 1]}. If you want to supply @samp{array[x = y, x + 1]} as an argument, |
| you must write it as @samp{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, @samp{min (min (a, b), c)} expands into this text: |
| |
| @example |
| ((((a) < (b) ? (a) : (b))) < (c) |
| ? (((a) < (b) ? (a) : (b))) |
| : (c)) |
| @end example |
| |
| @noindent |
| (Line breaks shown here for clarity would not actually be generated.) |
| |
| @cindex blank macro arguments |
| @cindex space as macro argument |
| If a macro @code{foo} takes one argument, and you want to supply an |
| empty argument, you must write at least some whitespace between the |
| parentheses, like this: @samp{foo ( )}. Just @samp{foo ()} is providing |
| no arguments, which is an error if @code{foo} expects an argument. But |
| @samp{foo0 ()} is the correct way to call a macro defined to take zero |
| arguments, like this: |
| |
| @example |
| #define foo0() @dots{} |
| @end example |
| |
| 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 @samp{min} in |
| the same source file that defines the macro. If you write @samp{&min} with |
| no argument list, you refer to the function. If you write @samp{min (x, |
| bb)}, with an argument list, the macro is expanded. If you write |
| @samp{(min) (a, bb)}, where the name @samp{min} is not followed by an |
| open-parenthesis, the macro is not expanded, so you wind up with a call to |
| the function @samp{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: |
| |
| @example |
| #define FOO(x) - 1 / (x) |
| @end example |
| |
| @noindent |
| (which defines @samp{FOO} to take an argument and expand into minus the |
| reciprocal of that argument) or this: |
| |
| @example |
| #define BAR (x) - 1 / (x) |
| @end example |
| |
| @noindent |
| (which defines @samp{BAR} to take no argument and always expand into |
| @samp{(x) - 1 / (x)}). |
| |
| Note that the @emph{uses} of a macro with arguments can have spaces before |
| the left parenthesis; it's the @emph{definition} where it matters whether |
| there is a space. |
| |
| @node Predefined, Stringification, Argument Macros, Macros |
| @subsection Predefined Macros |
| |
| @cindex 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. |
| @end menu |
| |
| @node Standard Predefined, Nonstandard Predefined, Predefined, Predefined |
| @subsubsection Standard Predefined Macros |
| @cindex 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 |
| @code{__GNUC__} in this table are standardized by ANSI C; the rest are |
| GNU C extensions. |
| |
| @table @code |
| @item __FILE__ |
| @findex __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 @samp{#include} or as the input file name argument. |
| |
| @item __LINE__ |
| @findex __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 @samp{__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, |
| |
| @smallexample |
| fprintf (stderr, "Internal error: " |
| "negative string length " |
| "%d at %s, line %d.", |
| length, __FILE__, __LINE__); |
| @end smallexample |
| |
| A @samp{#include} directive changes the expansions of @samp{__FILE__} |
| and @samp{__LINE__} to correspond to the included file. At the end of |
| that file, when processing resumes on the input file that contained |
| the @samp{#include} directive, the expansions of @samp{__FILE__} and |
| @samp{__LINE__} revert to the values they had before the |
| @samp{#include} (but @samp{__LINE__} is then incremented by one as |
| processing moves to the line after the @samp{#include}). |
| |
| The expansions of both @samp{__FILE__} and @samp{__LINE__} are altered |
| if a @samp{#line} directive is used. @xref{Combining Sources}. |
| |
| @item __DATE__ |
| @findex __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 @w{@samp{"Feb 1 1996"}}. |
| @c After reformatting the above, check that the date remains `Feb 1 1996', |
| @c all on one line, with two spaces between the `Feb' and the `1'. |
| |
| @item __TIME__ |
| @findex __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 @samp{"23:59:01"}. |
| |
| @item __STDC__ |
| @findex __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.) |
| |
| @item __STDC_VERSION__ |
| @findex __STDC_VERSION__ |
| This macro expands to the C Standard's version number, |
| a long integer constant of the form @samp{@var{yyyy}@var{mm}L} |
| where @var{yyyy} and @var{mm} are the year and month of the Standard version. |
| This signifies which version of the C Standard the preprocessor conforms to. |
| Like @samp{__STDC__}, whether this version number is accurate |
| for the entire implementation depends on what C compiler |
| will operate on the output from the preprocessor. |
| |
| @item __GNUC__ |
| @findex __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, @samp{__GNUC__} is undefined. The value |
| identifies the major version number of GNU CC (@samp{1} for GNU CC |
| version 1, which is now obsolete, and @samp{2} for version 2). |
| |
| @item __GNUC_MINOR__ |
| @findex __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 @code{__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6)}). |
| The last number, @samp{3} in the |
| example above, denotes the bugfix level of the compiler; no macro |
| contains this value. |
| |
| @item __GNUG__ |
| @findex __GNUG__ |
| The GNU C compiler defines this when the compilation language is |
| C++; use @samp{__GNUG__} to distinguish between GNU C and GNU |
| C++. |
| |
| @item __cplusplus |
| @findex __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 @samp{__cplusplus} |
| to test whether a header is compiled by a C compiler or a C++ compiler. |
| |
| @item __STRICT_ANSI__ |
| @findex __STRICT_ANSI__ |
| This macro is defined if and only if the @samp{-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@. |
| |
| @item __BASE_FILE__ |
| @findex __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. |
| |
| @item __INCLUDE_LEVEL__ |
| @findex __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 @samp{#include} directive and decremented at every |
| end of file. For input files specified by command line arguments, |
| the nesting level is zero. |
| |
| @item __VERSION__ |
| @findex __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 @samp{"2.6.0"}. The only reasonable use of this |
| macro is to incorporate it into a string constant. |
| |
| @item __OPTIMIZE__ |
| @findex __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. |
| |
| @item __CHAR_UNSIGNED__ |
| @findex __CHAR_UNSIGNED__ |
| This macro is defined if and only if the data type @code{char} is |
| unsigned on the target machine. It exists to cause the standard |
| header file @file{limits.h} to work correctly. It is bad practice |
| to refer to this macro yourself; instead, refer to the standard |
| macros defined in @file{limits.h}. The preprocessor uses |
| this macro to determine whether or not to sign-extend large character |
| constants written in octal; see @ref{#if Directive,,The @samp{#if} Directive}. |
| |
| @item __REGISTER_PREFIX__ |
| @findex __REGISTER_PREFIX__ |
| This macro expands to a string describing the prefix applied to cpu |
| registers in assembler code. It can be used to write assembler code |
| that is usable in multiple environments. For example, in the |
| @samp{m68k-aout} environment it expands to the string @samp{""}, |
| but in the @samp{m68k-coff} environment it expands to the string |
| @samp{"%"}. |
| |
| @item __USER_LABEL_PREFIX__ |
| @findex __USER_LABEL_PREFIX__ |
| This macro expands to a string describing the prefix applied to user |
| generated labels in assembler code. It can be used to write assembler |
| code that is usable in multiple environments. For example, in the |
| @samp{m68k-aout} environment it expands to the string @samp{"_"}, but in |
| the @samp{m68k-coff} environment it expands to the string @samp{""}. |
| This does not work with the @samp{-mno-underscores} option that the |
| i386 OSF/rose and m88k targets provide nor with the @samp{-mcall*} options |
| of the rs6000 System V Release 4 target. |
| @end table |
| |
| @node Nonstandard Predefined,, Standard Predefined, Predefined |
| @subsubsection 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 @samp{cpp -dM} to see the values of |
| predefined macros; see @ref{Invocation}. |
| |
| Some nonstandard predefined macros describe the operating system in use, |
| with more or less specificity. For example, |
| |
| @table @code |
| @item unix |
| @findex unix |
| @samp{unix} is normally predefined on all Unix systems. |
| |
| @item BSD |
| @findex BSD |
| @samp{BSD} is predefined on recent versions of Berkeley Unix |
| (perhaps only in version 4.3). |
| @end table |
| |
| Other nonstandard predefined macros describe the kind of CPU, with more or |
| less specificity. For example, |
| |
| @table @code |
| @item vax |
| @findex vax |
| @samp{vax} is predefined on Vax computers. |
| |
| @item mc68000 |
| @findex mc68000 |
| @samp{mc68000} is predefined on most computers whose CPU is a Motorola |
| 68000, 68010 or 68020. |
| |
| @item m68k |
| @findex m68k |
| @samp{m68k} is also predefined on most computers whose CPU is a 68000, |
| 68010 or 68020; however, some makers use @samp{mc68000} and some use |
| @samp{m68k}. Some predefine both names. What happens in GNU C |
| depends on the system you are using it on. |
| |
| @item M68020 |
| @findex M68020 |
| @samp{M68020} has been observed to be predefined on some systems that |
| use 68020 CPUs---in addition to @samp{mc68000} and @samp{m68k}, which |
| are less specific. |
| |
| @item _AM29K |
| @findex _AM29K |
| @itemx _AM29000 |
| @findex _AM29000 |
| Both @samp{_AM29K} and @samp{_AM29000} are predefined for the AMD 29000 |
| CPU family. |
| |
| @item ns32000 |
| @findex ns32000 |
| @samp{ns32000} is predefined on computers which use the National |
| Semiconductor 32000 series CPU. |
| @end table |
| |
| Yet other nonstandard predefined macros describe the manufacturer of |
| the system. For example, |
| |
| @table @code |
| @item sun |
| @findex sun |
| @samp{sun} is predefined on all models of Sun computers. |
| |
| @item pyr |
| @findex pyr |
| @samp{pyr} is predefined on all models of Pyramid computers. |
| |
| @item sequent |
| @findex sequent |
| @samp{sequent} is predefined on all models of Sequent computers. |
| @end table |
| |
| 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 @samp{-ansi} inhibits the definition of these |
| symbols. |
| |
| This tends to make @samp{-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 @samp{-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 @samp{__} at the beginning |
| and end. Thus, the symbol @code{__vax__} would be available on a Vax, |
| and so on. |
| |
| The set of nonstandard predefined names in the GNU C preprocessor is |
| controlled (when @code{cpp} is itself compiled) by the macro |
| @samp{CPP_PREDEFINES}, which should be a string containing @samp{-D} |
| options, separated by spaces. For example, on the Sun 3, we use the |
| following definition: |
| |
| @example |
| #define CPP_PREDEFINES "-Dmc68000 -Dsun -Dunix -Dm68k" |
| @end example |
| |
| @noindent |
| This macro is usually specified in @file{tm.h}. |
| |
| @node Stringification, Concatenation, Predefined, Macros |
| @subsection Stringification |
| |
| @cindex stringification |
| @dfn{Stringification} means turning a code fragment into a string constant |
| whose contents are the text for the code fragment. For example, |
| stringifying @samp{foo (z)} results in @samp{"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 @samp{#} 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 |
| @samp{#}. |
| |
| Here is an example of a macro definition that uses stringification: |
| |
| @smallexample |
| @group |
| #define WARN_IF(EXP) \ |
| do @{ if (EXP) \ |
| fprintf (stderr, "Warning: " #EXP "\n"); @} \ |
| while (0) |
| @end group |
| @end smallexample |
| |
| @noindent |
| Here the actual argument for @samp{EXP} is substituted once as given, |
| into the @samp{if} statement, and once as stringified, into the |
| argument to @samp{fprintf}. The @samp{do} and @samp{while (0)} are |
| a kludge to make it possible to write @samp{WARN_IF (@var{arg});}, |
| which the resemblance of @samp{WARN_IF} to a function would make |
| C programmers want to do; see @ref{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 @samp{EXP} |
| into a separate string constant, resulting in text like |
| |
| @smallexample |
| @group |
| do @{ if (x == 0) \ |
| fprintf (stderr, "Warning: " "x == 0" "\n"); @} \ |
| while (0) |
| @end group |
| @end smallexample |
| |
| @noindent |
| but the C compiler then sees three consecutive string constants and |
| concatenates them into one, producing effectively |
| |
| @smallexample |
| do @{ if (x == 0) \ |
| fprintf (stderr, "Warning: x == 0\n"); @} \ |
| while (0) |
| @end smallexample |
| |
| 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 @samp{p = "foo\n";} results in @samp{"p = |
| \"foo\\n\";"}. However, backslashes that are not inside of string or |
| character constants are not duplicated: @samp{\n} by itself stringifies to |
| @samp{"\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. |
| |
| @node Concatenation, Undefining, Stringification, Macros |
| @subsection Concatenation |
| @cindex concatenation |
| @cindex @samp{##} |
| @dfn{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 @samp{##} in the macro body. When the macro is called, |
| after actual arguments are substituted, all @samp{##} 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 @samp{##}. |
| |
| 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: |
| |
| @example |
| struct command |
| @{ |
| char *name; |
| void (*function) (); |
| @}; |
| |
| struct command commands[] = |
| @{ |
| @{ "quit", quit_command@}, |
| @{ "help", help_command@}, |
| @dots{} |
| @}; |
| @end example |
| |
| 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 @samp{_command}. Here is how it is done: |
| |
| @example |
| #define COMMAND(NAME) @{ #NAME, NAME ## _command @} |
| |
| struct command commands[] = |
| @{ |
| COMMAND (quit), |
| COMMAND (help), |
| @dots{} |
| @}; |
| @end example |
| |
| 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 |
| @samp{1.5} and @samp{e3}) into a number. Also, multi-character operators |
| such as @samp{+=} 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 @samp{x} on one side and @samp{+} 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 @samp{x} and @samp{+} 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 @samp{/} and @samp{*}: the @samp{/*} 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 @samp{##} 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. |
| |
| @node Undefining, Redefining, Concatenation, Macros |
| @subsection Undefining Macros |
| |
| @cindex undefining macros |
| To @dfn{undefine} a macro means to cancel its definition. This is done |
| with the @samp{#undef} directive. @samp{#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, |
| |
| @example |
| #define FOO 4 |
| x = FOO; |
| #undef FOO |
| x = FOO; |
| @end example |
| |
| @noindent |
| expands into |
| |
| @example |
| x = 4; |
| |
| x = FOO; |
| @end example |
| |
| @noindent |
| In this example, @samp{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 @samp{#undef} directive will cancel definitions with |
| arguments or definitions that don't expect arguments. The @samp{#undef} |
| directive has no effect when used on a name not currently defined as a macro. |
| |
| @node Redefining, Macro Pitfalls, Undefining, Macros |
| @subsection Redefining Macros |
| |
| @cindex redefining macros |
| @dfn{Redefining} a macro means defining (with @samp{#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 (@pxref{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 @samp{#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: |
| |
| @itemize @bullet |
| @item |
| Whitespace may be added or deleted at the beginning or the end. |
| |
| @item |
| 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. |
| @end itemize |
| |
| Recall that a comment counts as whitespace. |
| |
| @node Macro Pitfalls,, Redefining, Macros |
| @subsection Pitfalls and Subtleties of Macros |
| @cindex problems with macros |
| @cindex pitfalls 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. |
| * Newlines in Args:: Sometimes line numbers get confused. |
| @end menu |
| |
| @node Misnesting, Macro Parentheses, Macro Pitfalls, Macro Pitfalls |
| @subsubsection 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, |
| |
| @example |
| #define double(x) (2*(x)) |
| #define call_with_1(x) x(1) |
| @end example |
| |
| @noindent |
| would expand @samp{call_with_1 (double)} into @samp{(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, |
| |
| @example |
| #define strange(file) fprintf (file, "%s %d", |
| @dots{} |
| strange(stderr) p, 35) |
| @end example |
| |
| @noindent |
| This bizarre example expands to @samp{fprintf (stderr, "%s %d", p, 35)}! |
| |
| @node Macro Parentheses, Swallow Semicolon, Misnesting, Macro Pitfalls |
| @subsubsection Unintended Grouping of Arithmetic |
| @cindex parentheses in macro bodies |
| |
| 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, |
| |
| @example |
| #define ceil_div(x, y) (x + y - 1) / y |
| @end example |
| |
| @noindent |
| whose purpose is to divide, rounding up. (One use for this operation is |
| to compute how many @samp{int} objects are needed to hold a certain |
| number of @samp{char} objects.) Then suppose it is used as follows: |
| |
| @example |
| a = ceil_div (b & c, sizeof (int)); |
| @end example |
| |
| @noindent |
| This expands into |
| |
| @example |
| a = (b & c + sizeof (int) - 1) / sizeof (int); |
| @end example |
| |
| @noindent |
| which does not do what is intended. The operator-precedence rules of |
| C make it equivalent to this: |
| |
| @example |
| a = (b & (c + sizeof (int) - 1)) / sizeof (int); |
| @end example |
| |
| @noindent |
| But what we want is this: |
| |
| @example |
| a = ((b & c) + sizeof (int) - 1)) / sizeof (int); |
| @end example |
| |
| @noindent |
| Defining the macro as |
| |
| @example |
| #define ceil_div(x, y) ((x) + (y) - 1) / (y) |
| @end example |
| |
| @noindent |
| provides the desired result. |
| |
| Unintended grouping can result in another way. Consider |
| @samp{sizeof ceil_div(1, 2)}. That has the appearance of a C expression |
| that would compute the size of the type of @samp{ceil_div (1, 2)}, but in |
| fact it means something very different. Here is what it expands to: |
| |
| @example |
| sizeof ((1) + (2) - 1) / (2) |
| @end example |
| |
| @noindent |
| This would take the size of an integer and divide it by two. The precedence |
| rules have put the division outside the @samp{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 @samp{ceil_div}: |
| |
| @example |
| #define ceil_div(x, y) (((x) + (y) - 1) / (y)) |
| @end example |
| |
| @node Swallow Semicolon, Side Effects, Macro Parentheses, Macro Pitfalls |
| @subsubsection Swallowing the Semicolon |
| |
| @cindex semicolons (after macro calls) |
| 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 @samp{p} says where to find it) across whitespace |
| characters: |
| |
| @example |
| #define SKIP_SPACES (p, limit) \ |
| @{ register char *lim = (limit); \ |
| while (p != lim) @{ \ |
| if (*p++ != ' ') @{ \ |
| p--; break; @}@}@} |
| @end example |
| |
| @noindent |
| 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 @samp{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 @samp{SKIP_SPACES (p, lim);} |
| |
| But this can cause trouble before @samp{else} statements, because the |
| semicolon is actually a null statement. Suppose you write |
| |
| @example |
| if (*p != 0) |
| SKIP_SPACES (p, lim); |
| else @dots{} |
| @end example |
| |
| @noindent |
| The presence of two statements---the compound statement and a null |
| statement---in between the @samp{if} condition and the @samp{else} |
| makes invalid C code. |
| |
| The definition of the macro @samp{SKIP_SPACES} can be altered to solve |
| this problem, using a @samp{do @dots{} while} statement. Here is how: |
| |
| @example |
| #define SKIP_SPACES (p, limit) \ |
| do @{ register char *lim = (limit); \ |
| while (p != lim) @{ \ |
| if (*p++ != ' ') @{ \ |
| p--; break; @}@}@} \ |
| while (0) |
| @end example |
| |
| Now @samp{SKIP_SPACES (p, lim);} expands into |
| |
| @example |
| do @{@dots{}@} while (0); |
| @end example |
| |
| @noindent |
| which is one statement. |
| |
| @node Side Effects, Self-Reference, Swallow Semicolon, Macro Pitfalls |
| @subsubsection Duplication of Side Effects |
| |
| @cindex side effects (in macro arguments) |
| @cindex unsafe macros |
| Many C programs define a macro @samp{min}, for ``minimum'', like this: |
| |
| @example |
| #define min(X, Y) ((X) < (Y) ? (X) : (Y)) |
| @end example |
| |
| When you use this macro with an argument containing a side effect, |
| as shown here, |
| |
| @example |
| next = min (x + y, foo (z)); |
| @end example |
| |
| @noindent |
| it expands as follows: |
| |
| @example |
| next = ((x + y) < (foo (z)) ? (x + y) : (foo (z))); |
| @end example |
| |
| @noindent |
| where @samp{x + y} has been substituted for @samp{X} and @samp{foo (z)} |
| for @samp{Y}. |
| |
| The function @samp{foo} is used only once in the statement as it appears |
| in the program, but the expression @samp{foo (z)} has been substituted |
| twice into the macro expansion. As a result, @samp{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 @samp{min} is an @dfn{unsafe} macro. |
| |
| The best solution to this problem is to define @samp{min} in a way that |
| computes the value of @samp{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: |
| |
| @example |
| #define min(X, Y) \ |
| (@{ typeof (X) __x = (X), __y = (Y); \ |
| (__x < __y) ? __x : __y; @}) |
| @end example |
| |
| If you do not wish to use GNU C extensions, the only solution is to be |
| careful when @emph{using} the macro @samp{min}. For example, you can |
| calculate the value of @samp{foo (z)}, save it in a variable, and use that |
| variable in @samp{min}: |
| |
| @example |
| #define min(X, Y) ((X) < (Y) ? (X) : (Y)) |
| @dots{} |
| @{ |
| int tem = foo (z); |
| next = min (x + y, tem); |
| @} |
| @end example |
| |
| @noindent |
| (where we assume that @samp{foo} returns type @samp{int}). |
| |
| @node Self-Reference, Argument Prescan, Side Effects, Macro Pitfalls |
| @subsubsection Self-Referential Macros |
| |
| @cindex self-reference |
| A @dfn{self-referential} macro is one whose name appears in its definition. |
| A special feature of ANSI Standard C is that the self-reference is not |
| considered a macro call. It is passed into the preprocessor output |
| unchanged. |
| |
| Let's consider an example: |
| |
| @example |
| #define foo (4 + foo) |
| @end example |
| |
| @noindent |
| where @samp{foo} is also a variable in your program. |
| |
| Following the ordinary rules, each reference to @samp{foo} will expand into |
| @samp{(4 + foo)}; then this will be rescanned and will expand into @samp{(4 |
| + (4 + foo))}; and so on until it causes a fatal error (memory full) in the |
| preprocessor. |
| |
| However, the special rule about self-reference cuts this process short |
| after one step, at @samp{(4 + foo)}. Therefore, this macro definition |
| has the possibly useful effect of causing the program to add 4 to |
| the value of @samp{foo} wherever @samp{foo} is referred to. |
| |
| In most cases, it is a bad idea to take advantage of this feature. A |
| person reading the program who sees that @samp{foo} is a variable will |
| not expect that it is a macro as well. The reader will come across the |
| identifier @samp{foo} in the program and think its value should be that |
| of the variable @samp{foo}, whereas in fact the value is four greater. |
| |
| The special rule for self-reference applies also to @dfn{indirect} |
| self-reference. This is the case where a macro @var{x} expands to use a |
| macro @samp{y}, and the expansion of @samp{y} refers to the macro |
| @samp{x}. The resulting reference to @samp{x} comes indirectly from the |
| expansion of @samp{x}, so it is a self-reference and is not further |
| expanded. Thus, after |
| |
| @example |
| #define x (4 + y) |
| #define y (2 * x) |
| @end example |
| |
| @noindent |
| @samp{x} would expand into @samp{(4 + (2 * x))}. Clear? |
| |
| But suppose @samp{y} is used elsewhere, not from the definition of @samp{x}. |
| Then the use of @samp{x} in the expansion of @samp{y} is not a self-reference |
| because @samp{x} is not ``in progress''. So it does expand. However, |
| the expansion of @samp{x} contains a reference to @samp{y}, and that |
| is an indirect self-reference now because @samp{y} is ``in progress''. |
| The result is that @samp{y} expands to @samp{(2 * (4 + y))}. |
| |
| It is not clear that this behavior would ever be useful, but it is specified |
| by the ANSI C standard, so you may need to understand it. |
| |
| @node Argument Prescan, Cascaded Macros, Self-Reference, Macro Pitfalls |
| @subsubsection Separate Expansion of Macro Arguments |
| @cindex expansion of arguments |
| @cindex macro argument expansion |
| @cindex prescan of macro arguments |
| |
| We have explained that the expansion of a macro, including the substituted |
| actual arguments, is scanned over again for macro calls to be expanded. |
| |
| What really happens is more subtle: first each actual argument text is scanned |
| separately for macro calls. Then the results of this are substituted into |
| the macro body to produce the macro expansion, and the macro expansion |
| is scanned again for macros to expand. |
| |
| The result is that the actual arguments are scanned @emph{twice} to expand |
| macro calls in them. |
| |
| Most of the time, this has no effect. If the actual argument contained |
| any macro calls, they are expanded during the first scan. The result |
| therefore contains no macro calls, so the second scan does not change it. |
| If the actual argument were substituted as given, with no prescan, |
| the single remaining scan would find the same macro calls and produce |
| the same results. |
| |
| You might expect the double scan to change the results when a |
| self-referential macro is used in an actual argument of another macro |
| (@pxref{Self-Reference}): the self-referential macro would be expanded once |
| in the first scan, and a second time in the second scan. But this is not |
| what happens. The self-references that do not expand in the first scan are |
| marked so that they will not expand in the second scan either. |
| |
| The prescan is not done when an argument is stringified or concatenated. |
| Thus, |
| |
| @example |
| #define str(s) #s |
| #define foo 4 |
| str (foo) |
| @end example |
| |
| @noindent |
| expands to @samp{"foo"}. Once more, prescan has been prevented from |
| having any noticeable effect. |
| |
| More precisely, stringification and concatenation use the argument as |
| written, in un-prescanned form. The same actual argument would be used in |
| prescanned form if it is substituted elsewhere without stringification or |
| concatenation. |
| |
| @example |
| #define str(s) #s lose(s) |
| #define foo 4 |
| str (foo) |
| @end example |
| |
| expands to @samp{"foo" lose(4)}. |
| |
| You might now ask, ``Why mention the prescan, if it makes no difference? |
| And why not skip it and make the preprocessor faster?'' The answer is |
| that the prescan does make a difference in three special cases: |
| |
| @itemize @bullet |
| @item |
| Nested calls to a macro. |
| |
| @item |
| Macros that call other macros that stringify or concatenate. |
| |
| @item |
| Macros whose expansions contain unshielded commas. |
| @end itemize |
| |
| We say that @dfn{nested} calls to a macro occur when a macro's actual |
| argument contains a call to that very macro. For example, if @samp{f} |
| is a macro that expects one argument, @samp{f (f (1))} is a nested |
| pair of calls to @samp{f}. The desired expansion is made by |
| expanding @samp{f (1)} and substituting that into the definition of |
| @samp{f}. The prescan causes the expected result to happen. |
| Without the prescan, @samp{f (1)} itself would be substituted as |
| an actual argument, and the inner use of @samp{f} would appear |
| during the main scan as an indirect self-reference and would not |
| be expanded. Here, the prescan cancels an undesirable side effect |
| (in the medical, not computational, sense of the term) of the special |
| rule for self-referential macros. |
| |
| But prescan causes trouble in certain other cases of nested macro calls. |
| Here is an example: |
| |
| @example |
| #define foo a,b |
| #define bar(x) lose(x) |
| #define lose(x) (1 + (x)) |
| |
| bar(foo) |
| @end example |
| |
| @noindent |
| We would like @samp{bar(foo)} to turn into @samp{(1 + (foo))}, which |
| would then turn into @samp{(1 + (a,b))}. But instead, @samp{bar(foo)} |
| expands into @samp{lose(a,b)}, and you get an error because @code{lose} |
| requires a single argument. In this case, the problem is easily solved |
| by the same parentheses that ought to be used to prevent misnesting of |
| arithmetic operations: |
| |
| @example |
| #define foo (a,b) |
| #define bar(x) lose((x)) |
| @end example |
| |
| The problem is more serious when the operands of the macro are not |
| expressions; for example, when they are statements. Then parentheses |
| are unacceptable because they would make for invalid C code: |
| |
| @example |
| #define foo @{ int a, b; @dots{} @} |
| @end example |
| |
| @noindent |
| In GNU C you can shield the commas using the @samp{(@{@dots{}@})} |
| construct which turns a compound statement into an expression: |
| |
| @example |
| #define foo (@{ int a, b; @dots{} @}) |
| @end example |
| |
| Or you can rewrite the macro definition to avoid such commas: |
| |
| @example |
| #define foo @{ int a; int b; @dots{} @} |
| @end example |
| |
| There is also one case where prescan is useful. It is possible |
| to use prescan to expand an argument and then stringify it---if you use |
| two levels of macros. Let's add a new macro @samp{xstr} to the |
| example shown above: |
| |
| @example |
| #define xstr(s) str(s) |
| #define str(s) #s |
| #define foo 4 |
| xstr (foo) |
| @end example |
| |
| This expands into @samp{"4"}, not @samp{"foo"}. The reason for the |
| difference is that the argument of @samp{xstr} is expanded at prescan |
| (because @samp{xstr} does not specify stringification or concatenation of |
| the argument). The result of prescan then forms the actual argument for |
| @samp{str}. @samp{str} uses its argument without prescan because it |
| performs stringification; but it cannot prevent or undo the prescanning |
| already done by @samp{xstr}. |
| |
| @node Cascaded Macros, Newlines in Args, Argument Prescan, Macro Pitfalls |
| @subsubsection Cascaded Use of Macros |
| |
| @cindex cascaded macros |
| @cindex macro body uses macro |
| A @dfn{cascade} of macros is when one macro's body contains a reference |
| to another macro. This is very common practice. For example, |
| |
| @example |
| #define BUFSIZE 1020 |
| #define TABLESIZE BUFSIZE |
| @end example |
| |
| This is not at all the same as defining @samp{TABLESIZE} to be @samp{1020}. |
| The @samp{#define} for @samp{TABLESIZE} uses exactly the body you |
| specify---in this case, @samp{BUFSIZE}---and does not check to see whether |
| it too is the name of a macro. |
| |
| It's only when you @emph{use} @samp{TABLESIZE} that the result of its expansion |
| is checked for more macro names. |
| |
| This makes a difference if you change the definition of @samp{BUFSIZE} |
| at some point in the source file. @samp{TABLESIZE}, defined as shown, |
| will always expand using the definition of @samp{BUFSIZE} that is |
| currently in effect: |
| |
| @example |
| #define BUFSIZE 1020 |
| #define TABLESIZE BUFSIZE |
| #undef BUFSIZE |
| #define BUFSIZE 37 |
| @end example |
| |
| @noindent |
| Now @samp{TABLESIZE} expands (in two stages) to @samp{37}. (The |
| @samp{#undef} is to prevent any warning about the nontrivial |
| redefinition of @code{BUFSIZE}.) |
| |
| @node Newlines in Args,, Cascaded Macros, Macro Pitfalls |
| @subsection Newlines in Macro Arguments |
| @cindex newlines in macro arguments |
| |
| Traditional macro processing carries forward all newlines in macro |
| arguments into the expansion of the macro. This means that, if some of |
| the arguments are substituted more than once, or not at all, or out of |
| order, newlines can be duplicated, lost, or moved around within the |
| expansion. If the expansion consists of multiple statements, then the |
| effect is to distort the line numbers of some of these statements. The |
| result can be incorrect line numbers, in error messages or displayed in |
| a debugger. |
| |
| The GNU C preprocessor operating in ANSI C mode adjusts appropriately |
| for multiple use of an argument---the first use expands all the |
| newlines, and subsequent uses of the same argument produce no newlines. |
| But even in this mode, it can produce incorrect line numbering if |
| arguments are used out of order, or not used at all. |
| |
| Here is an example illustrating this problem: |
| |
| @example |
| #define ignore_second_arg(a,b,c) a; c |
| |
| ignore_second_arg (foo (), |
| ignored (), |
| syntax error); |
| @end example |
| |
| @noindent |
| The syntax error triggered by the tokens @samp{syntax error} results |
| in an error message citing line four, even though the statement text |
| comes from line five. |
| |
| @node Conditionals, Combining Sources, Macros, Top |
| @section Conditionals |
| |
| @cindex conditionals |
| In a macro processor, a @dfn{conditional} is a directive that allows a part |
| of the program to be ignored during compilation, on some conditions. |
| In the C preprocessor, a conditional can test either an arithmetic expression |
| or whether a name is defined as a macro. |
| |
| A conditional in the C preprocessor resembles in some ways an @samp{if} |
| statement in C, but it is important to understand the difference between |
| them. The condition in an @samp{if} statement is tested during the execution |
| of your program. Its purpose is to allow your program to behave differently |
| from run to run, depending on the data it is operating on. The condition |
| in a preprocessing conditional directive is tested when your program is compiled. |
| Its purpose is to allow different code to be included in the program depending |
| on the situation at the time of compilation. |
| |
| @menu |
| * Uses: Conditional Uses. What conditionals are for. |
| * Syntax: Conditional Syntax. How conditionals are written. |
| * Deletion: Deleted Code. Making code into a comment. |
| * Macros: Conditionals-Macros. Why conditionals are used with macros. |
| * Assertions:: How and why to use assertions. |
| * Errors: #error Directive. Detecting inconsistent compilation parameters. |
| @end menu |
| |
| @node Conditional Uses |
| @subsection Why Conditionals are Used |
| |
| Generally there are three kinds of reason to use a conditional. |
| |
| @itemize @bullet |
| @item |
| A program may need to use different code depending on the machine or |
| operating system it is to run on. In some cases the code for one |
| operating system may be erroneous on another operating system; for |
| example, it might refer to library routines that do not exist on the |
| other system. When this happens, it is not enough to avoid executing |
| the invalid code: merely having it in the program makes it impossible |
| to link the program and run it. With a preprocessing conditional, the |
| offending code can be effectively excised from the program when it is |
| not valid. |
| |
| @item |
| You may want to be able to compile the same source file into two |
| different programs. Sometimes the difference between the programs is |
| that one makes frequent time-consuming consistency checks on its |
| intermediate data, or prints the values of those data for debugging, |
| while the other does not. |
| |
| @item |
| A conditional whose condition is always false is a good way to exclude |
| code from the program but keep it as a sort of comment for future |
| reference. |
| @end itemize |
| |
| Most simple programs that are intended to run on only one machine will |
| not need to use preprocessing conditionals. |
| |
| @node Conditional Syntax |
| @subsection Syntax of Conditionals |
| |
| @findex #if |
| A conditional in the C preprocessor begins with a @dfn{conditional |
| directive}: @samp{#if}, @samp{#ifdef} or @samp{#ifndef}. |
| @xref{Conditionals-Macros}, for information on @samp{#ifdef} and |
| @samp{#ifndef}; only @samp{#if} is explained here. |
| |
| @menu |
| * If: #if Directive. Basic conditionals using @samp{#if} and @samp{#endif}. |
| * Else: #else Directive. Including some text if the condition fails. |
| * Elif: #elif Directive. Testing several alternative possibilities. |
| @end menu |
| |
| @node #if Directive |
| @subsubsection The @samp{#if} Directive |
| |
| The @samp{#if} directive in its simplest form consists of |
| |
| @example |
| #if @var{expression} |
| @var{controlled text} |
| #endif /* @var{expression} */ |
| @end example |
| |
| The comment following the @samp{#endif} is not required, but it is a good |
| practice because it helps people match the @samp{#endif} to the |
| corresponding @samp{#if}. Such comments should always be used, except in |
| short conditionals that are not nested. In fact, you can put anything at |
| all after the @samp{#endif} and it will be ignored by the GNU C preprocessor, |
| but only comments are acceptable in ANSI Standard C@. |
| |
| @var{expression} is a C expression of integer type, subject to stringent |
| restrictions. It may contain |
| |
| @itemize @bullet |
| @item |
| Integer constants, which are all regarded as @code{long} or |
| @code{unsigned long}. |
| |
| @item |
| Character constants, which are interpreted according to the character |
| set and conventions of the machine and operating system on which the |
| preprocessor is running. The GNU C preprocessor uses the C data type |
| @samp{char} for these character constants; therefore, whether some |
| character codes are negative is determined by the C compiler used to |
| compile the preprocessor. If it treats @samp{char} as signed, then |
| character codes large enough to set the sign bit will be considered |
| negative; otherwise, no character code is considered negative. |
| |
| @item |
| Arithmetic operators for addition, subtraction, multiplication, |
| division, bitwise operations, shifts, comparisons, and logical |
| operations (@samp{&&} and @samp{||}). |
| |
| @item |
| Identifiers that are not macros, which are all treated as zero(!). |
| |
| @item |
| Macro calls. All macro calls in the expression are expanded before |
| actual computation of the expression's value begins. |
| @end itemize |
| |
| Note that @samp{sizeof} operators and @code{enum}-type values are not allowed. |
| @code{enum}-type values, like all other identifiers that are not taken |
| as macro calls and expanded, are treated as zero. |
| |
| The @var{controlled text} inside of a conditional can include |
| preprocessing directives. Then the directives inside the conditional are |
| obeyed only if that branch of the conditional succeeds. The text can |
| also contain other conditional groups. However, the @samp{#if} and |
| @samp{#endif} directives must balance. |
| |
| @node #else Directive |
| @subsubsection The @samp{#else} Directive |
| |
| @findex #else |
| The @samp{#else} directive can be added to a conditional to provide |
| alternative text to be used if the condition is false. This is what |
| it looks like: |
| |
| @example |
| #if @var{expression} |
| @var{text-if-true} |
| #else /* Not @var{expression} */ |
| @var{text-if-false} |
| #endif /* Not @var{expression} */ |
| @end example |
| |
| If @var{expression} is nonzero, and thus the @var{text-if-true} is |
| active, then @samp{#else} acts like a failing conditional and the |
| @var{text-if-false} is ignored. Contrariwise, if the @samp{#if} |
| conditional fails, the @var{text-if-false} is considered included. |
| |
| @node #elif Directive |
| @subsubsection The @samp{#elif} Directive |
| |
| @findex #elif |
| One common case of nested conditionals is used to check for more than two |
| possible alternatives. For example, you might have |
| |
| @example |
| #if X == 1 |
| @dots{} |
| #else /* X != 1 */ |
| #if X == 2 |
| @dots{} |
| #else /* X != 2 */ |
| @dots{} |
| #endif /* X != 2 */ |
| #endif /* X != 1 */ |
| @end example |
| |
| Another conditional directive, @samp{#elif}, allows this to be abbreviated |
| as follows: |
| |
| @example |
| #if X == 1 |
| @dots{} |
| #elif X == 2 |
| @dots{} |
| #else /* X != 2 and X != 1*/ |
| @dots{} |
| #endif /* X != 2 and X != 1*/ |
| @end example |
| |
| @samp{#elif} stands for ``else if''. Like @samp{#else}, it goes in the |
| middle of a @samp{#if}-@samp{#endif} pair and subdivides it; it does not |
| require a matching @samp{#endif} of its own. Like @samp{#if}, the |
| @samp{#elif} directive includes an expression to be tested. |
| |
| The text following the @samp{#elif} is processed only if the original |
| @samp{#if}-condition failed and the @samp{#elif} condition succeeds. |
| More than one @samp{#elif} can go in the same @samp{#if}-@samp{#endif} |
| group. Then the text after each @samp{#elif} is processed only if the |
| @samp{#elif} condition succeeds after the original @samp{#if} and any |
| previous @samp{#elif} directives within it have failed. @samp{#else} is |
| equivalent to @samp{#elif 1}, and @samp{#else} is allowed after any |
| number of @samp{#elif} directives, but @samp{#elif} may not follow |
| @samp{#else}. |
| |
| @node Deleted Code |
| @subsection Keeping Deleted Code for Future Reference |
| @cindex commenting out code |
| |
| If you replace or delete a part of the program but want to keep the old |
| code around as a comment for future reference, the easy way to do this |
| is to put @samp{#if 0} before it and @samp{#endif} after it. This is |
| better than using comment delimiters @samp{/*} and @samp{*/} since those |
| won't work if the code already contains comments (C comments do not |
| nest). |
| |
| This works even if the code being turned off contains conditionals, but |
| they must be entire conditionals (balanced @samp{#if} and @samp{#endif}). |
| |
| Conversely, do not use @samp{#if 0} for comments which are not C code. |
| Use the comment delimiters @samp{/*} and @samp{*/} instead. The |
| interior of @samp{#if 0} must consist of complete tokens; in particular, |
| singlequote characters must balance. But comments often contain |
| unbalanced singlequote characters (known in English as apostrophes). |
| These confuse @samp{#if 0}. They do not confuse @samp{/*}. |
| |
| @node Conditionals-Macros |
| @subsection Conditionals and Macros |
| |
| Conditionals are useful in connection with macros or assertions, because |
| those are the only ways that an expression's value can vary from one |
| compilation to another. A @samp{#if} directive whose expression uses no |
| macros or assertions is equivalent to @samp{#if 1} or @samp{#if 0}; you |
| might as well determine which one, by computing the value of the |
| expression yourself, and then simplify the program. |
| |
| For example, here is a conditional that tests the expression |
| @samp{BUFSIZE == 1020}, where @samp{BUFSIZE} must be a macro. |
| |
| @example |
| #if BUFSIZE == 1020 |
| printf ("Large buffers!\n"); |
| #endif /* BUFSIZE is large */ |
| @end example |
| |
| (Programmers often wish they could test the size of a variable or data |
| type in @samp{#if}, but this does not work. The preprocessor does not |
| understand @code{sizeof}, or typedef names, or even the type keywords |
| such as @code{int}.) |
| |
| @findex defined |
| The special operator @samp{defined} is used in @samp{#if} expressions to |
| test whether a certain name is defined as a macro. Either @samp{defined |
| @var{name}} or @samp{defined (@var{name})} is an expression whose value |
| is 1 if @var{name} is defined as macro at the current point in the |
| program, and 0 otherwise. For the @samp{defined} operator it makes no |
| difference what the definition of the macro is; all that matters is |
| whether there is a definition. Thus, for example,@refill |
| |
| @example |
| #if defined (vax) || defined (ns16000) |
| @end example |
| |
| @noindent |
| would succeed if either of the names @samp{vax} and @samp{ns16000} is |
| defined as a macro. You can test the same condition using assertions |
| (@pxref{Assertions}), like this: |
| |
| @example |
| #if #cpu (vax) || #cpu (ns16000) |
| @end example |
| |
| If a macro is defined and later undefined with @samp{#undef}, |
| subsequent use of the @samp{defined} operator returns 0, because |
| the name is no longer defined. If the macro is defined again with |
| another @samp{#define}, @samp{defined} will recommence returning 1. |
| |
| @findex #ifdef |
| @findex #ifndef |
| Conditionals that test whether just one name is defined are very common, |
| so there are two special short conditional directives for this case. |
| |
| @table @code |
| @item #ifdef @var{name} |
| is equivalent to @samp{#if defined (@var{name})}. |
| |
| @item #ifndef @var{name} |
| is equivalent to @samp{#if ! defined (@var{name})}. |
| @end table |
| |
| Macro definitions can vary between compilations for several reasons. |
| |
| @itemize @bullet |
| @item |
| Some macros are predefined on each kind of machine. For example, on a |
| Vax, the name @samp{vax} is a predefined macro. On other machines, it |
| would not be defined. |
| |
| @item |
| Many more macros are defined by system header files. Different |
| systems and machines define different macros, or give them different |
| values. It is useful to test these macros with conditionals to avoid |
| using a system feature on a machine where it is not implemented. |
| |
| @item |
| Macros are a common way of allowing users to customize a program for |
| different machines or applications. For example, the macro |
| @samp{BUFSIZE} might be defined in a configuration file for your |
| program that is included as a header file in each source file. You |
| would use @samp{BUFSIZE} in a preprocessing conditional in order to |
| generate different code depending on the chosen configuration. |
| |
| @item |
| Macros can be defined or undefined with @samp{-D} and @samp{-U} |
| command options when you compile the program. You can arrange to |
| compile the same source file into two different programs by choosing |
| a macro name to specify which program you want, writing conditionals |
| to test whether or how this macro is defined, and then controlling |
| the state of the macro with compiler command options. |
| @xref{Invocation}. |
| @end itemize |
| |
| @ifinfo |
| Assertions are usually predefined, but can be defined with preprocessor |
| directives or command-line options. |
| @end ifinfo |
| |
| @node Assertions |
| @subsection Assertions |
| |
| @cindex assertions |
| @dfn{Assertions} are a more systematic alternative to macros in writing |
| conditionals to test what sort of computer or system the compiled |
| program will run on. Assertions are usually predefined, but you can |
| define them with preprocessing directives or command-line options. |
| |
| @cindex predicates |
| The macros traditionally used to describe the type of target are not |
| classified in any way according to which question they answer; they may |
| indicate a hardware architecture, a particular hardware model, an |
| operating system, a particular version of an operating system, or |
| specific configuration options. These are jumbled together in a single |
| namespace. In contrast, each assertion consists of a named question and |
| an answer. The question is usually called the @dfn{predicate}. |
| An assertion looks like this: |
| |
| @example |
| #@var{predicate} (@var{answer}) |
| @end example |
| |
| @noindent |
| You must use a properly formed identifier for @var{predicate}. The |
| value of @var{answer} can be any sequence of words; all characters are |
| significant except for leading and trailing whitespace, and differences |
| in internal whitespace sequences are ignored. Thus, @samp{x + y} is |
| different from @samp{x+y} but equivalent to @samp{x + y}. @samp{)} is |
| not allowed in an answer. |
| |
| @cindex testing predicates |
| Here is a conditional to test whether the answer @var{answer} is asserted |
| for the predicate @var{predicate}: |
| |
| @example |
| #if #@var{predicate} (@var{answer}) |
| @end example |
| |
| @noindent |
| There may be more than one answer asserted for a given predicate. If |
| you omit the answer, you can test whether @emph{any} answer is asserted |
| for @var{predicate}: |
| |
| @example |
| #if #@var{predicate} |
| @end example |
| |
| @findex #system |
| @findex #machine |
| @findex #cpu |
| Most of the time, the assertions you test will be predefined assertions. |
| GNU C provides three predefined predicates: @code{system}, @code{cpu}, |
| and @code{machine}. @code{system} is for assertions about the type of |
| software, @code{cpu} describes the type of computer architecture, and |
| @code{machine} gives more information about the computer. For example, |
| on a GNU system, the following assertions would be true: |
| |
| @example |
| #system (gnu) |
| #system (mach) |
| #system (mach 3) |
| #system (mach 3.@var{subversion}) |
| #system (hurd) |
| #system (hurd @var{version}) |
| @end example |
| |
| @noindent |
| and perhaps others. The alternatives with |
| more or less version information let you ask more or less detailed |
| questions about the type of system software. |
| |
| On a Unix system, you would find @code{#system (unix)} and perhaps one of: |
| @code{#system (aix)}, @code{#system (bsd)}, @code{#system (hpux)}, |
| @code{#system (lynx)}, @code{#system (mach)}, @code{#system (posix)}, |
| @code{#system (svr3)}, @code{#system (svr4)}, or @code{#system (xpg4)} |
| with possible version numbers following. |
| |
| Other values for @code{system} are @code{#system (mvs)} |
| and @code{#system (vms)}. |
| |
| @strong{Portability note:} Many Unix C compilers provide only one answer |
| for the @code{system} assertion: @code{#system (unix)}, if they support |
| assertions at all. This is less than useful. |
| |
| An assertion with a multi-word answer is completely different from several |
| assertions with individual single-word answers. For example, the presence |
| of @code{system (mach 3.0)} does not mean that @code{system (3.0)} is true. |
| It also does not directly imply @code{system (mach)}, but in GNU C, that |
| last will normally be asserted as well. |
| |
| The current list of possible assertion values for @code{cpu} is: |
| @code{#cpu (a29k)}, @code{#cpu (alpha)}, @code{#cpu (arm)}, @code{#cpu |
| (clipper)}, @code{#cpu (convex)}, @code{#cpu (elxsi)}, @code{#cpu |
| (tron)}, @code{#cpu (h8300)}, @code{#cpu (i370)}, @code{#cpu (i386)}, |
| @code{#cpu (i860)}, @code{#cpu (i960)}, @code{#cpu (m68k)}, @code{#cpu |
| (m88k)}, @code{#cpu (mips)}, @code{#cpu (ns32k)}, @code{#cpu (hppa)}, |
| @code{#cpu (pyr)}, @code{#cpu (ibm032)}, @code{#cpu (rs6000)}, |
| @code{#cpu (sh)}, @code{#cpu (sparc)}, @code{#cpu (spur)}, @code{#cpu |
| (tahoe)}, @code{#cpu (vax)}, @code{#cpu (we32000)}. |
| |
| @findex #assert |
| You can create assertions within a C program using @samp{#assert}, like |
| this: |
| |
| @example |
| #assert @var{predicate} (@var{answer}) |
| @end example |
| |
| @noindent |
| (Note the absence of a @samp{#} before @var{predicate}.) |
| |
| @cindex unassert |
| @cindex assertions, undoing |
| @cindex retracting assertions |
| @findex #unassert |
| Each time you do this, you assert a new true answer for @var{predicate}. |
| Asserting one answer does not invalidate previously asserted answers; |
| they all remain true. The only way to remove an assertion is with |
| @samp{#unassert}. @samp{#unassert} has the same syntax as |
| @samp{#assert}. You can also remove all assertions about |
| @var{predicate} like this: |
| |
| @example |
| #unassert @var{predicate} |
| @end example |
| |
| You can also add or cancel assertions using command options |
| when you run @code{gcc} or @code{cpp}. @xref{Invocation}. |
| |
| @node #error Directive |
| @subsection The @samp{#error} and @samp{#warning} Directives |
| |
| @findex #error |
| The directive @samp{#error} causes the preprocessor to report a fatal |
| error. The rest of the line that follows @samp{#error} is used as the |
| error message. The line must consist of complete tokens. |
| |
| You would use @samp{#error} inside of a conditional that detects a |
| combination of parameters which you know the program does not properly |
| support. For example, if you know that the program will not run |
| properly on a Vax, you might write |
| |
| @smallexample |
| @group |
| #ifdef __vax__ |
| #error "Won't work on Vaxen. See comments at get_last_object." |
| #endif |
| @end group |
| @end smallexample |
| |
| @noindent |
| @xref{Nonstandard Predefined}, for why this works. |
| |
| If you have several configuration parameters that must be set up by |
| the installation in a consistent way, you can use conditionals to detect |
| an inconsistency and report it with @samp{#error}. For example, |
| |
| @smallexample |
| #if HASH_TABLE_SIZE % 2 == 0 || HASH_TABLE_SIZE % 3 == 0 \ |
| || HASH_TABLE_SIZE % 5 == 0 |
| #error HASH_TABLE_SIZE should not be divisible by a small prime |
| #endif |
| @end smallexample |
| |
| @findex #warning |
| The directive @samp{#warning} is like the directive @samp{#error}, but causes |
| the preprocessor to issue a warning and continue preprocessing. The rest of |
| the line that follows @samp{#warning} is used as the warning message. |
| |
| You might use @samp{#warning} in obsolete header files, with a message |
| directing the user to the header file which should be used instead. |
| |
| @node Combining Sources, Other Directives, Conditionals, Top |
| @section Combining Source Files |
| |
| @cindex line control |
| One of the jobs of the C preprocessor is to inform the C compiler of where |
| each line of C code came from: which source file and which line number. |
| |
| C code can come from multiple source files if you use @samp{#include}; |
| both @samp{#include} and the use of conditionals and macros can cause |
| the line number of a line in the preprocessor output to be different |
| from the line's number in the original source file. You will appreciate |
| the value of making both the C compiler (in error messages) and symbolic |
| debuggers such as GDB use the line numbers in your source file. |
| |
| The C preprocessor builds on this feature by offering a directive by which |
| you can control the feature explicitly. This is useful when a file for |
| input to the C preprocessor is the output from another program such as the |
| @code{bison} parser generator, which operates on another file that is the |
| true source file. Parts of the output from @code{bison} are generated from |
| scratch, other parts come from a standard parser file. The rest are copied |
| nearly verbatim from the source file, but their line numbers in the |
| @code{bison} output are not the same as their original line numbers. |
| Naturally you would like compiler error messages and symbolic debuggers to |
| know the original source file and line number of each line in the |
| @code{bison} input. |
| |
| @findex #line |
| @code{bison} arranges this by writing @samp{#line} directives into the output |
| file. @samp{#line} is a directive that specifies the original line number |
| and source file name for subsequent input in the current preprocessor input |
| file. @samp{#line} has three variants: |
| |
| @table @code |
| @item #line @var{linenum} |
| Here @var{linenum} is a decimal integer constant. This specifies that |
| the line number of the following line of input, in its original source file, |
| was @var{linenum}. |
| |
| @item #line @var{linenum} @var{filename} |
| Here @var{linenum} is a decimal integer constant and @var{filename} |
| is a string constant. This specifies that the following line of input |
| came originally from source file @var{filename} and its line number there |
| was @var{linenum}. Keep in mind that @var{filename} is not just a |
| file name; it is surrounded by doublequote characters so that it looks |
| like a string constant. |
| |
| @item #line @var{anything else} |
| @var{anything else} is checked for macro calls, which are expanded. |
| The result should be a decimal integer constant followed optionally |
| by a string constant, as described above. |
| @end table |
| |
| @samp{#line} directives alter the results of the @samp{__FILE__} and |
| @samp{__LINE__} predefined macros from that point on. @xref{Standard |
| Predefined}. |
| |
| The output of the preprocessor (which is the input for the rest of the |
| compiler) contains directives that look much like @samp{#line} directives. |
| They start with just @samp{#} instead of @samp{#line}, but this is |
| followed by a line number and file name as in @samp{#line}. @xref{Output}. |
| |
| @node Other Directives, Output, Combining Sources, Top |
| @section Miscellaneous Preprocessing Directives |
| |
| @cindex null directive |
| This section describes three additional preprocessing directives. They are |
| not very useful, but are mentioned for completeness. |
| |
| The @dfn{null directive} consists of a @samp{#} followed by a Newline, with |
| only whitespace (including comments) in between. A null directive is |
| understood as a preprocessing directive but has no effect on the preprocessor |
| output. The primary significance of the existence of the null directive is |
| that an input line consisting of just a @samp{#} will produce no output, |
| rather than a line of output containing just a @samp{#}. Supposedly |
| some old C programs contain such lines. |
| |
| @findex #pragma |
| The ANSI standard specifies that the effect of the @samp{#pragma} |
| directive is implementation-defined. In the GNU C preprocessor, |
| @samp{#pragma} directives are not used, except for @samp{#pragma once} |
| (@pxref{Once-Only}). However, they are left in the preprocessor output, |
| so they are available to the compilation pass. |
| |
| @findex #ident |
| The @samp{#ident} directive is supported for compatibility with certain |
| other systems. It is followed by a line of text. On some systems, the |
| text is copied into a special place in the object file; on most systems, |
| the text is ignored and this directive has no effect. Typically |
| @samp{#ident} is only used in header files supplied with those systems |
| where it is meaningful. |
| |
| @node Output, Invocation, Other Directives, Top |
| @section C Preprocessor Output |
| |
| @cindex output format |
| The output from the C preprocessor looks much like the input, except |
| that all preprocessing directive lines have been replaced with blank lines |
| and all comments with spaces. Whitespace within a line is not altered; |
| however, unless @samp{-traditional} is used, spaces may be inserted into |
| the expansions of macro calls to prevent tokens from being concatenated. |
| |
| Source file name and line number information is conveyed by lines of |
| the form |
| |
| @example |
| # @var{linenum} @var{filename} @var{flags} |
| @end example |
| |
| @noindent |
| which are inserted as needed into the middle of the input (but never |
| within a string or character constant). Such a line means that the |
| following line originated in file @var{filename} at line @var{linenum}. |
| |
| After the file name comes zero or more flags, which are @samp{1}, |
| @samp{2}, @samp{3}, or @samp{4}. If there are multiple flags, spaces separate |
| them. Here is what the flags mean: |
| |
| @table @samp |
| @item 1 |
| This indicates the start of a new file. |
| @item 2 |
| This indicates returning to a file (after having included another file). |
| @item 3 |
| This indicates that the following text comes from a system header file, |
| so certain warnings should be suppressed. |
| @item 4 |
| This indicates that the following text should be treated as C@. |
| @c maybe cross reference NO_IMPLICIT_EXTERN_C |
| @end table |
| |
| @node Invocation, Concept Index, Output, Top |
| @section Invoking the C Preprocessor |
| @cindex invocation of the preprocessor |
| |
| Most often when you use the C preprocessor you will not have to invoke it |
| explicitly: the C compiler will do so automatically. However, the |
| preprocessor is sometimes useful on its own. |
| |
| The C preprocessor expects two file names as arguments, @var{infile} and |
| @var{outfile}. The preprocessor reads @var{infile} together with any other |
| files it specifies with @samp{#include}. All the output generated by the |
| combined input files is written in @var{outfile}. |
| |
| Either @var{infile} or @var{outfile} may be @samp{-}, which as @var{infile} |
| means to read from standard input and as @var{outfile} means to write to |
| standard output. Also, if @var{outfile} or both file names are omitted, |
| the standard output and standard input are used for the omitted file names. |
| |
| @cindex options |
| Here is a table of command options accepted by the C preprocessor. |
| These options can also be given when compiling a C program; they are |
| passed along automatically to the preprocessor when it is invoked by the |
| compiler. |
| |
| @table @samp |
| @item -P |
| @findex -P |
| Inhibit generation of @samp{#}-lines with line-number information in |
| the output from the preprocessor (@pxref{Output}). This might be |
| useful when running the preprocessor on something that is not C code |
| and will be sent to a program which might be confused by the |
| @samp{#}-lines. |
| |
| @item -C |
| @findex -C |
| Do not discard comments: pass them through to the output file. |
| Comments appearing in arguments of a macro call will be copied to the |
| output before the expansion of the macro call. |
| |
| @item -traditional |
| @findex -traditional |
| Try to imitate the behavior of old-fashioned C, as opposed to ANSI C@. |
| |
| @itemize @bullet |
| @item |
| Traditional macro expansion pays no attention to singlequote or |
| doublequote characters; macro argument symbols are replaced by the |
| argument values even when they appear within apparent string or |
| character constants. |
| |
| @item |
| Traditionally, it is permissible for a macro expansion to end in the |
| middle of a string or character constant. The constant continues into |
| the text surrounding the macro call. |
| |
| @item |
| However, traditionally the end of the line terminates a string or |
| character constant, with no error. |
| |
| @item |
| In traditional C, a comment is equivalent to no text at all. (In ANSI |
| C, a comment counts as whitespace.) |
| |
| @item |
| Traditional C does not have the concept of a ``preprocessing number''. |
| It considers @samp{1.0e+4} to be three tokens: @samp{1.0e}, @samp{+}, |
| and @samp{4}. |
| |
| @item |
| A macro is not suppressed within its own definition, in traditional C@. |
| Thus, any macro that is used recursively inevitably causes an error. |
| |
| @item |
| The character @samp{#} has no special meaning within a macro definition |
| in traditional C@. |
| |
| @item |
| In traditional C, the text at the end of a macro expansion can run |
| together with the text after the macro call, to produce a single token. |
| (This is impossible in ANSI C@.) |
| |
| @item |
| Traditionally, @samp{\} inside a macro argument suppresses the syntactic |
| significance of the following character. |
| @end itemize |
| |
| @item -trigraphs |
| @findex -trigraphs |
| Process ANSI standard trigraph sequences. These are three-character |
| sequences, all starting with @samp{??}, that are defined by ANSI C to |
| stand for single characters. For example, @samp{??/} stands for |
| @samp{\}, so @samp{'??/n'} is a character constant for a newline. |
| Strictly speaking, the GNU C preprocessor does not support all |
| programs in ANSI Standard C unless @samp{-trigraphs} is used, but if |
| you ever notice the difference it will be with relief. |
| |
| You don't want to know any more about trigraphs. |
| |
| @item -pedantic |
| @findex -pedantic |
| Issue warnings required by the ANSI C standard in certain cases such |
| as when text other than a comment follows @samp{#else} or @samp{#endif}. |
| |
| @item -pedantic-errors |
| @findex -pedantic-errors |
| Like @samp{-pedantic}, except that errors are produced rather than |
| warnings. |
| |
| @item -Wtrigraphs |
| @findex -Wtrigraphs |
| Warn if any trigraphs are encountered (assuming they are enabled). |
| |
| @item -Wcomment |
| @findex -Wcomment |
| @ignore |
| @c "Not worth documenting" both singular and plural forms of this |
| @c option, per RMS. But also unclear which is better; hence may need to |
| @c switch this at some future date. pesch@cygnus.com, 2jan92. |
| @itemx -Wcomments |
| (Both forms have the same effect). |
| @end ignore |
| Warn whenever a comment-start sequence @samp{/*} appears in a @samp{/*} |
| comment, or whenever a Backslash-Newline appears in a @samp{//} comment. |
| |
| @item -Wall |
| @findex -Wall |
| Requests both @samp{-Wtrigraphs} and @samp{-Wcomment} (but not |
| @samp{-Wtraditional} or @samp{-Wundef}). |
| |
| @item -Wtraditional |
| @findex -Wtraditional |
| Warn about certain constructs that behave differently in traditional and |
| ANSI C@. |
| |
| @item -Wundef |
| @findex -Wundef |
| Warn if an undefined identifier is evaluated in an @samp{#if} directive. |
| |
| @item -I @var{directory} |
| @findex -I |
| Add the directory @var{directory} to the head of the list of |
| directories to be searched for header files (@pxref{Include Syntax}). |
| This can be used to override a system header file, substituting your |
| own version, since these directories are searched before the system |
| header file directories. If you use more than one @samp{-I} option, |
| the directories are scanned in left-to-right order; the standard |
| system directories come after. |
| |
| @item -I- |
| Any directories specified with @samp{-I} options before the @samp{-I-} |
| option are searched only for the case of @samp{#include "@var{file}"}; |
| they are not searched for @samp{#include <@var{file}>}. |
| |
| If additional directories are specified with @samp{-I} options after |
| the @samp{-I-}, these directories are searched for all @samp{#include} |
| directives. |
| |
| In addition, the @samp{-I-} option inhibits the use of the current |
| directory as the first search directory for @samp{#include "@var{file}"}. |
| Therefore, the current directory is searched only if it is requested |
| explicitly with @samp{-I.}. Specifying both @samp{-I-} and @samp{-I.} |
| allows you to control precisely which directories are searched before |
| the current one and which are searched after. |
| |
| @item -nostdinc |
| @findex -nostdinc |
| Do not search the standard system directories for header files. |
| Only the directories you have specified with @samp{-I} options |
| (and the current directory, if appropriate) are searched. |
| |
| @item -nostdinc++ |
| @findex -nostdinc++ |
| Do not search for header files in the C++-specific standard directories, |
| but do still search the other standard directories. |
| (This option is used when building libg++.) |
| |
| @item -D @var{name} |
| @findex -D |
| Predefine @var{name} as a macro, with definition @samp{1}. |
| |
| @item -D @var{name}=@var{definition} |
| Predefine @var{name} as a macro, with definition @var{definition}. |
| There are no restrictions on the contents of @var{definition}, but if |
| you are invoking the preprocessor from a shell or shell-like program you |
| may need to use the shell's quoting syntax to protect characters such as |
| spaces that have a meaning in the shell syntax. If you use more than |
| one @samp{-D} for the same @var{name}, the rightmost definition takes |
| effect. |
| |
| @item -U @var{name} |
| @findex -U |
| Do not predefine @var{name}. If both @samp{-U} and @samp{-D} are |
| specified for one name, the @samp{-U} beats the @samp{-D} and the name |
| is not predefined. |
| |
| @item -undef |
| @findex -undef |
| Do not predefine any nonstandard macros. |
| |
| @item -A @var{predicate}(@var{answer}) |
| @findex -A |
| Make an assertion with the predicate @var{predicate} and answer |
| @var{answer}. @xref{Assertions}. |
| |
| @noindent |
| You can use @samp{-A-} to disable all predefined assertions; it also |
| undefines all predefined macros that identify the type of target system. |
| |
| @item -dM |
| @findex -dM |
| Instead of outputting the result of preprocessing, output a list of |
| @samp{#define} directives for all the macros defined during the |
| execution of the preprocessor, including predefined macros. This gives |
| you a way of finding out what is predefined in your version of the |
| preprocessor; assuming you have no file @samp{foo.h}, the command |
| |
| @example |
| touch foo.h; cpp -dM foo.h |
| @end example |
| |
| @noindent |
| will show the values of any predefined macros. |
| |
| @item -dD |
| @findex -dD |
| Like @samp{-dM} except in two respects: it does @emph{not} include the |
| predefined macros, and it outputs @emph{both} the @samp{#define} |
| directives and the result of preprocessing. Both kinds of output go to |
| the standard output file. |
| |
| @item -M [-MG] |
| @findex -M |
| Instead of outputting the result of preprocessing, output a rule |
| suitable for @code{make} describing the dependencies of the main |
| source file. The preprocessor outputs one @code{make} rule containing |
| the object file name for that source file, a colon, and the names of |
| all the included files. If there are many included files then the |
| rule is split into several lines using @samp{\}-newline. |
| |
| @samp{-MG} says to treat missing header files as generated files and assume |
| they live in the same directory as the source file. It must be specified |
| in addition to @samp{-M}. |
| |
| This feature is used in automatic updating of makefiles. |
| |
| @item -MM [-MG] |
| @findex -MM |
| Like @samp{-M} but mention only the files included with @samp{#include |
| "@var{file}"}. System header files included with @samp{#include |
| <@var{file}>} are omitted. |
| |
| @item -MD @var{file} |
| @findex -MD |
| Like @samp{-M} but the dependency information is written to @var{file}. |
| This is in addition to compiling the file as specified---@samp{-MD} does |
| not inhibit ordinary compilation the way @samp{-M} does. |
| |
| When invoking gcc, do not specify the @var{file} argument. |
| Gcc will create file names made by replacing ".c" with ".d" at |
| the end of the input file names. |
| |
| In Mach, you can use the utility @code{md} to merge multiple dependency |
| files into a single dependency file suitable for using with the @samp{make} |
| command. |
| |
| @item -MMD @var{file} |
| @findex -MMD |
| Like @samp{-MD} except mention only user header files, not system |
| header files. |
| |
| @item -H |
| @findex -H |
| Print the name of each header file used, in addition to other normal |
| activities. |
| |
| @item -imacros @var{file} |
| @findex -imacros |
| Process @var{file} as input, discarding the resulting output, before |
| processing the regular input file. Because the output generated from |
| @var{file} is discarded, the only effect of @samp{-imacros @var{file}} |
| is to make the macros defined in @var{file} available for use in the |
| main input. |
| |
| @item -include @var{file} |
| @findex -include |
| Process @var{file} as input, and include all the resulting output, |
| before processing the regular input file. |
| |
| @item -idirafter @var{dir} |
| @findex -idirafter |
| @cindex second include path |
| Add the directory @var{dir} to the second include path. The directories |
| on the second include path are searched when a header file is not found |
| in any of the directories in the main include path (the one that |
| @samp{-I} adds to). |
| |
| @item -iprefix @var{prefix} |
| @findex -iprefix |
| Specify @var{prefix} as the prefix for subsequent @samp{-iwithprefix} |
| options. |
| |
| @item -iwithprefix @var{dir} |
| @findex -iwithprefix |
| Add a directory to the second include path. The directory's name is |
| made by concatenating @var{prefix} and @var{dir}, where @var{prefix} |
| was specified previously with @samp{-iprefix}. |
| |
| @item -isystem @var{dir} |
| @findex -isystem |
| Add a directory to the beginning of the second include path, marking it |
| as a system directory, so that it gets the same special treatment as |
| is applied to the standard system directories. |
| |
| @item -lang-c |
| @itemx -lang-c89 |
| @itemx -lang-c++ |
| @itemx -lang-objc |
| @itemx -lang-objc++ |
| @findex -lang-c |
| @findex -lang-c89 |
| @findex -lang-c++ |
| @findex -lang-objc |
| @findex -lang-objc++ |
| Specify the source language. @samp{-lang-c} is the default; it |
| allows recognition of C++ comments (comments that begin with |
| @samp{//} and end at end of line) and hexadecimal floating-point constants, |
| since these features will most likely appear in the next C standard. |
| @samp{-lang-c89} disables recognition of C++ comments and |
| hexadecimal floating-point constants. @samp{-lang-c++} |
| handles C++ comment syntax and includes extra default include |
| directories for C++. @samp{-lang-objc} enables the Objective C |
| @samp{#import} directive. @samp{-lang-objc++} enables both C++ and Objective C |
| extensions. |
| |
| These options are generated by the compiler driver @code{gcc}, but not |
| passed from the @samp{gcc} command line unless you use the driver's |
| @samp{-Wp} option. |
| |
| @item -lint |
| Look for commands to the program checker @code{lint} embedded in |
| comments, and emit them preceded by @samp{#pragma lint}. For example, |
| the comment @samp{/* NOTREACHED */} becomes @samp{#pragma lint |
| NOTREACHED}. |
| |
| This option is available only when you call @code{cpp} directly; |
| @code{gcc} will not pass it from its command line. |
| |
| @item -$ |
| @findex -$ |
| Forbid the use of @samp{$} in identifiers. This was formerly required |
| for strict conformance to the C Standard before the standard was |
| corrected. |
| |
| This option is available only when you call @code{cpp} directly; |
| @code{gcc} will not pass it from its command line. |
| |
| @end table |
| |
| @node Concept Index, Index, Invocation, Top |
| @unnumbered Concept Index |
| @printindex cp |
| |
| @node Index,, Concept Index, Top |
| @unnumbered Index of Directives, Macros and Options |
| @printindex fn |
| |
| @contents |
| @bye |