12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919 |
- \input texinfo
- @setfilename cpp
- @settitle The C Preprocessor
- @ifinfo
- This file documents the GNU C Preprocessor.
- Copyright (C) 1987 Richard M. Stallman.
- 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
- @sp 6
- @center @titlefont{The C Preprocessor}
- @sp 4
- @center First Edition
- @sp 1
- @center January 1987
- @sp 5
- @center Richard M. Stallman
- @page
- @vskip 0pt plus 1filll
- Copyright @copyright{} 1987 Richard M. Stallman.
- 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 preprocessor commands, 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
- switches @samp{-T}, @samp{-undef} and @samp{-pedantic}, but in practice the
- consequences of having strict ANSI Standard C make it undesirable to do
- this. @xref{Invocation}.
- @menu
- * Global Actions:: Actions made uniformly on all input files.
- * Commands:: General syntax of preprocessor commands.
- * Header Files:: How and why to use header files.
- * Macros:: How and why to use macros.
- * Conditionals:: How and why to use conditionals.
- * Combining Sources:: Use of line control when you combine source files.
- * Other Commands:: Miscellaneous preprocessor commands.
- * Output:: Format of output from the C preprocessor.
- * Invocation:: How to invoke the preprocessor; command switches.
- * Concept Index:: Index of concepts and terms.
- * Index:: Index of commands, predefined macros and switches.
- @end menu
- @node Global Actions, Commands, Top, Top
- @section Transformations Made Globally
- Most C preprocessor features are inactive unless you give specific commands
- to request their use. (Preprocessor commands are lines starting with
- @samp{#}; @pxref{Commands}). But there are three transformations that the
- preprocessor always makes on all the input it receives, even in the absence
- of commands.
- @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 preprocessor commands are recognized. Thus, for example, you
- can split a line cosmetically with Backslash-Newline just about anywhere.
- Even
- @example
- #defi\
- ne FO\
- O 10\
- 20
- @end example
- @noindent
- is equivalent into @samp{#define FOO 1020}.
- But there are a few exceptions to both transformations.
- @itemize @bullet
- @item
- C comments and predefined macro names are not recognized inside a
- @samp{#include} command 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 is not discarded if preceded by an odd number of
- additional Backslashes. This is because the Backslashes quote each
- other, leaving the Newline as an ordinary Newline.
- @example
- x\\
- y
- @end example
- @noindent
- is an example of a Backslash-Newline that is preserved from deletion for
- this reason.
- @end itemize
- @node Commands, Header Files, Global Actions, Top
- @section Preprocessor Commands
- @cindex preprocessor commands
- @cindex commands
- Most preprocessor features are active only if you use preprocessor commands
- to request their use.
- Preprocessor commands are lines in your program that start with @samp{#}.
- The @samp{#} is followed by an identifier that is the @dfn{command name}.
- For example, @samp{#define} is the command that defines a macro.
- Whitespace is also allowed before and after the @samp{#}.
- The set of valid command names is fixed. Programs cannot define new
- preprocessor commands.
- Some command names require arguments; these make up the rest of the command
- line and must be separated from the command name by whitespace. For example,
- @samp{#define} must be followed by a macro name and the intended expansion
- of the macro.
- A preprocessor command cannot be more than one line in normal circumstances.
- It may be split cosmetically with Backslash-Newline, but that has no effect
- on its meaning. Comments containing Newlines can also divide the command into
- multiple lines, but the comments are changed to Spaces before the command
- is interpreted. The only way a significant Newline can occur in a preprocessor
- command is within a string constant or character constant. Note that
- most C compilers that might be applied to the output from the preprocessor
- do not accept string or character constants containing Newlines.
- The @samp{#} and the command 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 preprocessor command.
- @node Header Files, Macros, Commands, 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 preprocessor command
- @samp{#include}.
- @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
- 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}.
- @node Include Syntax, Include Operation, Header Uses, Header Files
- @subsection The @samp{#include} Command
- @findex #include
- Both user and system header files are included using the preprocessor
- command @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 standard list of system directories.
- {{how can the user find out about/control this list?}}
- 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 command 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.
- @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 working
- directory, and then in a specified list of directories for user
- header files, and finally in the same directories used for system header
- files. The current working directory is tried first because it is
- presumed to be the location of the files of the program being
- compiled. The other directories for user header files are specified
- with the command switch @samp{-I} (@pxref{Invocation}).
- @var{file} may not contain @samp{"} characters unless they are
- preceded by Backslashes. Note, however, that such Backslashes are
- @emph{not} discarded when searching for the file. None of the character
- escape sequences appropriate to string constants in C is processed;
- all Backslashes are significant. Thus, @samp{#include "x\n\"y"}
- specifies a filename containing two Backslashes. It is not clear why
- this behavior is ever useful, but the ANSI standard specifies it.
- @item #include @var{anything else}
- This variant is called a @dfn{computed #include}. Any @samp{#include}
- command whose argument does not fit the above two forms is a computed
- include. @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.
- This feature allows you to define a macro which controls the file name
- to be used at a later point in the program. One application of this
- is to allow a site-configuration file for your program to specify the
- names of the system include files to be used. This can help in
- porting the program to various operating systems in which the
- necessary system header files are found in different places.
- @end table
- @node Include Operation,, Include Syntax, Header Files
- @subsection How @samp{#include} Works
- The @samp{#include} command works by directing the C preprocessor to scan
- the specified file as input before continuing with the rest of the current
- file. The output from the preprocessor contains the output already
- generated, followed by the output resulting from the included file,
- followed by the output that comes from the text after the @samp{#include}
- command. For example, given two files as follows:
- @example
- /* File program.c */
- int x;
- #include "header.h"
- main ()
- @{
- printf (test ());
- @}
- /* File header.h */
- char *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; they
- are merely the typical use. Any fragment of a C program can be included
- from another file. The include file could even contain the beginning of a
- statement that is concluded in the containing file, or the end of a
- statement that was started in the including file. However, a comment or a
- string or character constant may not start in the included file and finish
- in the including file. An unterminated comment, string constant or
- character constant in an included file is considered to end (with an error
- message) at the end of the file.
- The line following the @samp{#include} command is always treated as a
- separate line by the C preprocessor even if the included file lacks a final
- newline.
- @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
- A @dfn{simple macro} is a kind of abbreviation. It is a name which stands
- for a fragment of code.
- Before you can use a macro, you must @dfn{define} it explicitly with the
- @samp{#define} command. @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}. Therefore, if somewhere after this @samp{#define} command
- 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
- @noindent
- the definition must be a single line; however, it may not end in the
- middle of a multi-line string constant or character constant.
- The use of all upper case for macro names is a standard convention.
- Programs are easier to read when it is possible to tell at a glance which
- names are macros.
- Normally, a macro definition must be a single line, like all C preprocessor
- commands. (You can split a long macro definition cosmetically with
- Backslash-Newline.) There is one exception: Newlines can be included in
- the macro definition if within a string or character constant. By the same
- token, it is not possible for a macro definition to contain an unbalanced
- quote character; the definition automatically extends to include the
- matching quote character that ends the string or character constant.
- Comments within a macro definition may contain Newlines, which make no
- difference since the comments are entirely replaced with Spaces regardless
- of their contents.
- Aside from the above, there is no restriction on what can go in a macro
- body. Parentheses need not balance. The body need not resemble valid C
- code. (Of course, you might get error messages from the C compiler when
- you use the macro.)
- The C preprocessor scans your program sequentially, so macro definitions
- take effect at the place you write them. Therefore, the following input to
- the C preprocessor
- @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
- 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.
- To define a macro that uses arguments, you write a @samp{#define} command
- 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:
- @example
- #define min(X, Y) ((X) < (Y) ? (X) : (Y))
- @end example
- 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; thus, 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
- @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.)
- If you use the macro name followed by something other than an
- open-parenthesis, 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 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}.
- It is not allowed to define the same name as both a simple macro and
- a macro with arguments.
- In the definition of a macro with arguments, the list of argument names
- must follow the macro name immediately with no space in between. If there
- is a space after the macro name, the macro is defined as taking no
- arguments, and all the rest of the name is taken to be the expansion.
- The reason for this is that it is often useful to define a macro that
- takes no arguments and whose definition begins with an identifier in
- parentheses. This rule about spaces makes it possible for you to do either
- @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
- @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)}.
- @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
- The standard predefined macros are available with the same meanings on all
- operating systems and all kinds of machines. Their names all start and end
- with double underscores. Here is a table of them.
- @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.
- @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,
- @example
- fprintf (stderr, "Internal error: negative string length "
- "%d at %s, line %d.",
- length, __FILE__, __LINE__);
- @end example
- A @samp{#include} command 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} command, 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} command 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 @samp{"Jan 29 1987"} or @samp{"Apr
- @ 1 1905"}.
- @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.)
- @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.
- 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 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.
- @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} that
- are less specific.
- @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{sun} is predefined on all models of Pyramid 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. However,
- the GNU C preprocessor would be useless if it did not predefine the same
- names that are normally predefined on the system and machine you are using.
- Even system header files check the predefined names and will generate
- incorrect declarations if they do not find the names that are expected.
- The set of nonstandard predefined names in the GNU C preprocessor is controlled
- by the macro @samp{PREDEFS}, which should be set with a @samp{-D} switch
- in the @file{Makefile} to a string constant containing names separated
- by commas. The Doublequotes that delimit the string constant must be
- escaped with Backslashes to get them through the shell. For example,
- @samp{\"unix,sun,m68k,mc68000\"} is used on Suns.
- @node Stringification, Concatenation, Predefined, Macros
- @subsection Stringification
- @cindex stringification
- @dfn{Stringification} means turning an 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:
- @example
- #define WARN_IF(EXP) \
- do @{ if (EXP) fprintf (stderr, "Warning: " #EXP "\n"); @} while (0)
- @end example
- @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; @pxref{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 @samp{EXP}'s actual argument
- into a separate string constant, resulting in text like
- @example
- do @{ if (x == 0) fprintf (stderr, "Warning: " "x == 0" "\n"); @} while (0)
- @end example
- @noindent
- but the C compiler then sees three consecutive string constants and
- concatenates them into one, producing effectively
- @example
- do @{ if (x == 0) fprintf (stderr, "Warning: x == 0\n"); @} while (0)
- @end example
- 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
- @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} command. @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} command will cancel definitions with
- arguments or definitions that don't expect arguments. The @samp{#undef}
- command 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 reefinition 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
- 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.
- @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
- 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}'s are needed to hold
- a certain number of @samp{char}'s.) 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 is does not do what is intended the operator-precedence rules of
- C make it equivalent to
- @example
- a = (b & (c + sizeof (int) - 1)) / sizeof (int);
- @end example
- What we want is
- @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.
- However, 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
- layed 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
- 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
- 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
- Let's consider a call to the macro @samp{min}:
- @example
- #define min(X, Y) ((X) < (Y) ? (X) : (Y))
- @dots{}
- next = min (x + y, foo (z));
- @end example
- expands into
- @example
- next = ((x + y) < (foo (z)) ? (x + y) : (foo (z)));
- @end example
- 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.
- Solving this problem cleanly would involve defining @samp{min} in
- a way that would compute the value of @samp{foo (z)} only once.
- Unfortunately, the C language offers no way to do this. So 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 I 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 a
- 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 @samp{y}'s expansion 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 need to understand it.
- @node Argument Prescan, Cascaded Macros, Self-Reference, Macro Pitfalls
- @subsubsection Separate Expansion of Macro Arguments
- We have explained that the expansion of a macro, including the substituted
- actual arguments, is scanned over again for macro calls to be expanded.
- What really happens is more subtle: first each actual argument text is scanned
- separately for macro calls. Then the results of this are substituted into
- the macro body to produce the macro expansion, and the macro expansion
- is scanned again for macros to expand.
- The result is that the actual arguments are scanned @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.
- (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.) 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.
- You might now ask, ``Why mention the prescan, if it makes no difference?
- Why not skip it and make the preprocessor faster?'' The answer is that the
- prescan does make a difference in two special cases:
- @itemize @bullet
- @item
- Nested calls to a macro.
- @item
- Macros that call other macros that stringify or concatenate.
- @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.
- 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 strigification; but it cannot prevent or undo the prescanning
- already done by @samp{xstr}.
- @node Cascaded Macros,, 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
- Now @samp{TABLESIZE} expands (in two stages) to @samp{37}.
- @node Conditionals, Combining Sources, Macros, Top
- @section Conditionals
- @cindex conditionals
- In a macro processor, a @dfn{conditional} is a command that allows a part
- of the program to be ignored during compilation, on some conditions.
- In the C preprocessor, a conditional can test either an arithmetic expression
- or whether a name is defined as a macro.
- A conditional in the C preprocessor resembles in some ways an @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 preprocessor conditional command is tested when your program is compiled.
- Its purpose is to allow different code to be included in the program depending
- on the situation at the time of compilation.
- @menu
- * Uses: Conditional Uses. What conditionals are for.
- * Syntax: Conditional Syntax. How conditionals are written.
- * Deletion: Deleted Code. Making code into a comment.
- * Macros: Conditionals-Macros. Why conditionals are used with macros.
- * Errors: #error Command. Detecting inconsistent compilation parameters.
- @end menu
- @node Conditional Uses, Conditional Syntax, Conditionals, Conditionals
- 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 preprocessor 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 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 preprocessor conditionals.
- @node Conditional Syntax, Conditionals-Macros, Conditional Uses, Conditionals
- @subsection Syntax of Conditionals
- @findex #if
- A conditional in the C preprocessor begins with a @dfn{conditional
- command}: @samp{#if}, @samp{#ifdef} or @samp{#ifndef}.@xref{Conditionals},
- for info on @samp{#ifdef} and @samp{#ifndef}; only @samp{#if} is explained
- here.
- @menu
- * If: #if Command. Basic conditionals using @samp{#if} and @samp{#endif}.
- * Else: #else Command. Including some text if the condition fails.
- * Elif: #elif Command. Testing several alternative possibilities.
- @end menu
- @node #if Command, #else Command, Conditional Syntax, Conditional Syntax
- @subsubsection The @samp{#if} Command
- The @samp{#if} command 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 @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 text inside of a conditional can include preprocessor commands. Then
- the commands inside the conditional are obeyed only if that branch of the
- conditional succeeds. The text can also contain other conditional groups.
- However, the @samp{#if}'s and @samp{#endif}'s must balance.
- @node #else Command, #elif Command, #if Command, Conditional Syntax
- @subsubsection The @samp{#else} Command
- @findex #else
- The @samp{#else} command can be added a conditional to provide alternative
- text to be used if the condition is false. This 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 the @var{text-if-true} is considered
- included, 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 Command,, #else Command, Conditional Syntax
- @subsubsection The @samp{#elif} Command
- @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 command, @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} command 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 succeeeds. 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}'s within it have failed. @samp{#else} is equivalent to
- @samp{#elif 1}, and @samp{#else} is allowed after any number of
- @samp{#elif}'s, but @samp{#elif} may not follow a @samp{#else}.
- @node Deleted Code, Conditionals-Macros, Conditional Syntax, Conditionals
- @subsection Keeping Deleted Code for Future Reference
- If you replace or delete a part of the program but want to keep the old
- code around as a comment for future reference, the easy way to do this is
- to put @samp{#if 0} before it and @samp{#endif} after it.
- This works even if the code being turned off contains conditionals, but
- they must be entire conditionals (balanced @samp{#if} and @samp{#endif}).
- @node Conditionals-Macros, #error Command, Deleted Code, Conditionals
- @subsection Conditionals and Macros
- Conditionals are rarely useful except in connection with macros. A
- @samp{#if} command whose expression uses no macros 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. But when the expression uses macros, its value can vary from
- compilation to compilation.
- 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
- @findex defined
- The special operator @samp{defined} may be 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})}.
- @noindent
- 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,
- @example
- #if defined (vax) || defined (ns16000)
- @end example
- @noindent
- would include the following code if either of the names @samp{vax} and
- @samp{ns16000} is defined as a macro.
- If a macro is defined and later undefined with @samp{#undef},
- subsequent use of the @samp{defined} operator will return 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 just the definedness of one name are very common, so
- there are two special short conditional commands for this case. They are
- @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 preprocessor 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 switches 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 switches.
- @xref{Invocation}.
- @end itemize
- @node #error Command,, Conditionals-Macros, Conditionals
- @subsection The @samp{#error} Command
- @findex #error
- The command @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.
- 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
- @example
- #ifdef vax
- #error Won't work on Vaxen. See comments at get_last_object.
- #endif
- @end example
- @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,
- @example
- #if HASH_TABLE_SIZE % 2 == 0 || HASH_TABLE_SIZE % 3 == 0 \
- || HASH_TABLE_SIZE % 5 == 0
- #error HASH_TABLE_SIZE should not be divisible by a small prime
- #endif
- @end example
- @node Combining Sources, Other Commands, Conditionals, Top
- @section Combining Source Files
- @cindex line control
- @findex #line
- 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 command by which
- you can control the feature explicitly. This is useful when a file for
- input to the C preprocessor is the output from another program such as the
- @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} output.
- @code{bison} arranges this by writing @samp{#line} commands into the output
- file. @samp{#line} is a command 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 Doublequotes.
- @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} commands alter the results of the @samp{__FILE__} and
- @samp{__LINE__} predefined macros from that point on. @xref{Standard
- Predefined}.
- @node Other Commands, Output, Combining Sources, Top
- @section Miscellaneous Preprocessor Commands
- @findex #pragma
- @cindex null command
- This section describes two additional preprocesor commands. They are
- not very useful, but are mentioned for completeness.
- The @dfn{null command} consists of a @samp{#} followed by a Newline, with
- only whitespace (including comments) in between. A null command is
- understood as a preprocessor command but has no effect on the preprocessor
- output. The primary significance of the existence of the null command is
- that an input line consisting of just a @samp{#} will produce no output,
- rather than a line of output containing just a @samp{#}. Supposedly
- some old C programs contain such lines.
- The @samp{#pragma} command is specified in the ANSI standard to have an
- arbitrary implementation-defined effect. In the GNU C preprocessor,
- @samp{#pragma} first attempts to run the game @code{rogue}; if that fails,
- it tries to run the game @code{hack}; if that fails, it tries to run
- GNU Emacs displaying the Tower of Hanoi; if that fails, it reports a
- fatal error. In any case, preprocessing does not continue.
- @node Output, Invocation, Other Commands, Top
- @section C Preprocessor Output
- @cindex output format
- The output from the C preprocessor looks much like the input, except
- that all preprocessor command lines have been replaced with blank lines
- and all comments with spaces. Whitespace within a line is not altered;
- however, a space is inserted after the expansions of most macro calls.
- Source file name and line number information is conveyed by lines of
- the form
- @example
- # @var{linenum} @var{filename}
- @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}.
- @node Invocation,, Output, Top
- @section Invoking the C Preprocessor
- Most often when you use the C preprocessor you will not have to invoke it
- explicitly: the C compiler will do so automatically. However, the
- preprocessor is sometimes useful individually.
- The C preprocessor expects two file names as arguments, @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 switches
- Here is a table of command switches accepted by the C preprocessor. Most
- of them can also be given when compiling a C program; they are passed along
- automatically to the preprocessor when it is invoked by the compiler.
- @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 -T
- @findex -T
- 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 Newline.
- Strictly speaking, the GNU C preprocessor does not support all
- programs in ANSI Standard C unless @samp{-T} is used, but you 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 -I @var{directory}
- @findex -I
- Add the directory @var{directory} to the end of the list of
- directories to be searched for user header files (@pxref{Include
- Syntax}).
- @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.
- @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 -d
- @findex -d
- Instead of outputting the result of preprocessing, output a list of
- @samp{#define} commands for all the macros defined during the
- execution of the preprocessor.
- @item -i @var{file}
- @findex -i
- 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{-i @var{file}} is to
- make the macros defined in @var{file} available for use in the main
- input.
- @end table
- @node Concept Index, Index, Invocation, Top
- @unnumbered Concept Index
- @printindex cp
- @node Index,, Concept Index, Top
- @unnumbered Index of Commands, Macros and Switches
- @printindex fn
- @contents
- @bye
|