⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autobook_196.html

📁 Autoconf使用手册
💻 HTML
字号:
<HTML><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><!-- Created on September, 12  2004 by texi2html 1.64 --><!-- Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)            Karl Berry  <karl@freefriends.org>            Olaf Bachmann <obachman@mathematik.uni-kl.de>            and many others.Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>Send bugs and suggestions to <texi2html@mathematik.uni-kl.de> --><HEAD><TITLE>Autoconf, Automake, and Libtool: Macros and macro expansion</TITLE><META NAME="description" CONTENT="Autoconf, Automake, and Libtool: Macros and macro expansion"><META NAME="keywords" CONTENT="Autoconf, Automake, and Libtool: Macros and macro expansion"><META NAME="resource-type" CONTENT="document"><META NAME="distribution" CONTENT="global"><META NAME="Generator" CONTENT="texi2html 1.64"><script language="Javascript"><!--    // Check the browser version.    function checkVersion() {      if (navigator.appVersion.charAt(0)>=3) return true;      if (navigator.appVersion.charAt(0)>=4) return true;      else return false;    }      if (checkVersion()) {             homeon = new Image();             homeon.src = "homeon.png";             homeoff = new Image();             homeoff.src = "home.png";             tocon = new Image();             tocon.src = "tocon.png";             tocoff = new Image();             tocoff.src = "toc.png";             indexon = new Image();             indexon.src = "indexon.png";             indexoff = new Image();             indexoff.src = "index.png";             helpon = new Image();             helpon.src = "helpon.png";             helpoff = new Image();             helpoff.src = "help.png";             backon = new Image();             backon.src = "backon.png";             backoff = new Image();             backoff.src = "back.png";             forwardon = new Image();             forwardon.src = "forwardon.png";             forwardoff = new Image();             forwardoff.src = "forward.png";             prevon = new Image();             prevon.src = "prevon.png";             prevoff = new Image();             prevoff.src = "prev.png";             nexton = new Image();             nexton.src = "nexton.png";             nextoff = new Image();             nextoff.src = "next.png";             upon = new Image();             upon.src = "upon.png";             upoff = new Image();             upoff.src = "up.png";         }     function img_act(imgName) {             if (checkVersion()) {             imgOn = eval(imgName + "on.src");             document [imgName].src = imgOn;             }     }     function img_inact(imgName) {             if (checkVersion()) {             imgOff = eval(imgName + "off.src");             document [imgName].src = imgOff;             }     }// --></SCRIPT></HEAD><BODY LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#6688AA" VLINK="#336688" ALINK="#808080"><A NAME="SEC196"></A><TABLE BORDER=0 CELLPADDING=0 CELLSPACING=10><TR VALIGN="TOP"><TD ALIGN="MIDDLE" WIDTH=50 BGCOLOR="#e6e6e6"><TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_195.html#SEC195" onMouseover="img_act('prev')" onMouseout="img_inact('prev')"><IMG SRC="prev.png" BORDER="0" ALT="Back: Token scanning" ALIGN="MIDDLE" NAME="prev"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_197.html#SEC197" onMouseover="img_act('next')" onMouseout="img_inact('next')"><IMG SRC="next.png" BORDER="0" ALT="Forward: Quoting" ALIGN="MIDDLE" NAME="next"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_197.html#SEC197" onMouseover="img_act('back')" onMouseout="img_inact('back')"><IMG SRC="back.png" BORDER="0" ALT="FastBack: Quoting" ALIGN="MIDDLE" NAME="back"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_194.html#SEC194" onMouseover="img_act('up')" onMouseout="img_inact('up')"><IMG SRC="up.png" BORDER="0" ALT="Up: Fundamentals of M4 processing" ALIGN="MIDDLE" NAME="up"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_198.html#SEC198" onMouseover="img_act('forward')" onMouseout="img_inact('forward')"><IMG SRC="forward.png" BORDER="0" ALT="FastForward: Features of M4" ALIGN="MIDDLE" NAME="forward"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook.html#SEC_Top" onMouseover="img_act('home')" onMouseout="img_inact('home')"><IMG SRC="home.png" BORDER="0" ALT="Top: Autoconf, Automake, and Libtool" ALIGN="MIDDLE" NAME="home"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_toc.html#SEC_Contents" onMouseover="img_act('toc')" onMouseout="img_inact('toc')"><IMG SRC="toc.png" BORDER="0" ALT="Contents: Table of Contents" ALIGN="MIDDLE" NAME="toc"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_285.html#SEC285" onMouseover="img_act('index')" onMouseout="img_inact('index')"><IMG SRC="index.png" BORDER="0" ALT="Index: Index" ALIGN="MIDDLE" NAME="index"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_abt.html#SEC_About" onMouseover="img_act('help')" onMouseout="img_inact('help')"><IMG SRC="help.png" BORDER="0" ALT="About: About this document" ALIGN="MIDDLE" NAME="help"></A></TD></TR></TABLE></TD><TD ALIGN="LEFT"><H3> 21.3.2 Macros and macro expansion </H3><!--docid::SEC196::--><P>Macros are definitions of replacement text and are identified by aname--as defined by the syntax rules given in <A HREF="autobook_195.html#SEC195">21.3.1 Token scanning</A>.M4 maintains an internal table of macros, some of which arebuilt-ins defined when <CODE>m4</CODE> starts.  When a name is found in theinput that matches a name registered in M4's macro table, themacro <EM>invocation</EM> in the input is replaced by the macro'sdefinition in the output.  This process is known as<EM>expansion</EM>---even if the new text may be shorter!  Many beginnersto M4 confuse themselves the moment they start to use phraseslike `I am going to call this particular macro, which returns thisvalue'.  As you will see, macros differ significantly from<EM>functions</EM> in other programming languages, regardless of howsimilar their syntax may seem.  You should instead use phrases like `IfI invoke this macro, it will expand to this text'.</P><P>Suppose M4 knows about a simple macro called <SAMP>`foo'</SAMP> that isdefined to be <SAMP>`bar'</SAMP>.  Given the following input, <CODE>m4</CODE> wouldproduce the corresponding output:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>That is one big foo.=>That is one big bar.</FONT></pre></td></tr></table></P><P>The period character at the end of this sentence is not permitted inmacro names, thus <CODE>m4</CODE> knows when to stop scanning the <SAMP>`foo'</SAMP>token and consult the table of macro definitions for a macro named<SAMP>`foo'</SAMP>.</P><P>Curiously, macros are defined to <CODE>m4</CODE> using the built-in macro<CODE>define</CODE>.  The example shown above would be defined to <CODE>m4</CODE>with the following input:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>define(`foo', `bar')</FONT></pre></td></tr></table></P><P>Since <CODE>define</CODE> is itself a macro, it too must have anexpansion--by definition, it is the empty string, or <EM>void</EM>.Thus, <CODE>m4</CODE> will appear to consume macro invocations like these fromthe input.  The <CODE>`</CODE> and <CODE>'</CODE> characters are M4's defaultquote characters and play an important role (<A HREF="autobook_197.html#SEC197">21.3.3 Quoting</A>).  Additionalbuilt-in macros exist for managing macro definitions (<A HREF="autobook_200.html#SEC200">21.4.2 Macro management</A>).</P><P>We've explored the simplest kind of macros that exist in M4.  To makemacros substantially more useful, M4 extends the concept to macros whichaccept a number of arguments <A NAME="DOCF49" HREF="autobook_fot.html#FOOT49">(49)</A>.  If a macro is given arguments, themacro may address its arguments using the special macro names <SAMP>`$1'</SAMP>through to <SAMP>`$n'</SAMP>, where <SAMP>`n'</SAMP> is the maximum number of argumentsthat the macro cares to reference.  When such a macro is invoked, theargument list must be delimited by commas and enclosed in parentheses.Any whitespace that precedes an argument is discarded, but trailingwhitespace (for example, before the next comma) is preserved.  Here isan example of a macro which expands to its third argument:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>define(`foo', `$3')That is one big foo(3, `0x', `beef').=>That is one big beef.</FONT></pre></td></tr></table></P><P>Arguments in M4 are simply text, so they have no type.  If amacro which accepts arguments is invoked, <CODE>m4</CODE> will expand themacro regardless of how many arguments are provided.  M4 willnot produce errors due to conditions such as a mismatched number ofarguments, or arguments with malformed values/types.  It is theresponsibility of the macro to validate the argument list and this is animportant practice when writing GNU Autotools macros.  Some commonM4 idioms have developed for this purpose and are covered in<A HREF="autobook_201.html#SEC201">21.4.3 Conditionals</A>.  A macro that expects arguments can still be invokedwithout arguments--the number of arguments seen by the macro will bezero:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>This is still one big foo.=>That is one big .</FONT></pre></td></tr></table></P><P>A macro invoked with an empty argument list is not empty at all, butrather is considered to be a single empty string:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>This is one big empty foo().=>That is one big .</FONT></pre></td></tr></table></P><P>It is also important to understand how macros are expanded.  It is herethat you will see why an M4 macro is not the same as afunction in any other programming language.  The explanation you've beenreading about macro expansion thus far is a little bit simplistic:macros are not exactly matched in the input and expanded in the output.In actual fact, the macro's expansion replaces the invocation in theinput stream and it is <EM>rescanned</EM> for further expansions untilthere are none remaining.  Here is an illustrative example:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>define(`foobar', `FUBAR')define(`f', `foo')f()bar=>FUBAR</FONT></pre></td></tr></table></P><P>If the token <SAMP>`a1'</SAMP> were to be found in the input, <CODE>m4</CODE> wouldreplace it with <SAMP>`a2'</SAMP> in the input stream and rescan.  Thiscontinues until no definition can be found for <CODE>a4</CODE>, at which pointthe literal text <SAMP>`a4'</SAMP> will be sent to the output.  This is <EM>byfar the biggest point of misunderstanding</EM> for new M4 users.</P><P>The same principles apply for the collection of arguments to macroswhich accept arguments.  Before a macro's actual arguments are handed tothe macro, they are expanded until there are no more expansions left.Here is an example--using the built-in <CODE>define</CODE> macro (where theproblems are no different) which highlights the consequences of this.Normally, <CODE>define</CODE> will redefine any existing macro:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>define(foo, bar)define(foo, baz)</FONT></pre></td></tr></table></P><P>In this example, we expect <SAMP>`foo'</SAMP> to be defined to <SAMP>`bar'</SAMP> andthen redefined to <SAMP>`baz'</SAMP>.  Instead, we've defined a new macro<SAMP>`bar'</SAMP> that is defined to be <SAMP>`baz'</SAMP>!  Why?  The second<CODE>define</CODE> invocation has its arguments expanded prior to theexpanding the <CODE>define</CODE> macro.  At this stage, the name <SAMP>`foo'</SAMP>is expanded to its original definition, <CODE>bar</CODE>.  In effect, we'vestated:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>define(foo, bar)define(bar, baz)</FONT></pre></td></tr></table></P><P>Sometimes this can be a very useful property, but mostly it serves tothoroughly confuse the GNU Autotools macro writer.  The key is to know that<CODE>m4</CODE> will expand as much text as it can as early as possible in itsprocessing.  Expansion can be prevented by quoting <A NAME="DOCF50" HREF="autobook_fot.html#FOOT50">(50)</A> and is discussed in detail in thefollowing section.</P><P><A NAME="Quoting"></A></TR></TABLE><BR>  <FONT SIZE="-1">This document was generatedby <I>Gary V. Vaughan</I> on <I>September, 12  2004</I>using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html"><I>texi2html</I></A></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -