123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>The Macro Expansion Process</title>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <link href="theme/style.css" rel="stylesheet" type="text/css">
- </head>
- <body>
- <table width="100%" border="0" cellspacing="2" background="theme/bkd2.gif">
- <tr>
- <td width="21"> <h1></h1></td>
- <td width="885"> <font face="Verdana, Arial, Helvetica, sans-serif"><b><font size="6">The
- Macro Expansion Process</font></b></font></td>
- <td width="96"><a href="http://www.boost.org"><img src="theme/wave.gif" width="93" height="68" align="right" border="0"></a></td>
- </tr>
- </table>
- <br>
- <table border="0">
- <tr>
- <td width="10"></td>
- <td width="30"><a href="../index.html"><img src="theme/u_arr.gif" border="0"></a></td>
- <td width="30"><a href="predefined_macros.html"><img src="theme/l_arr.gif" border="0"></a></td>
- <td width="30"><a href="compiletime_config.html"><img src="theme/r_arr.gif" border="0"></a></td>
- </tr>
- </table>
- <p>The macro expansion process described here was initially developed by <a href="mailto:pmenso57@attbi.com">Paul
- Mensonides</a> and is implemented in <tt>Wave</tt>. It is much more understandable
- as the description of the desired macro expansion algorithm provided in the
- C++ Standard <a href="references.html#iso_cpp">[1]</a>.</p>
- <p>Macro replacement proceeds left-to-right. </p>
- <p>If, during scanning (or rescanning) an identifier is found, it is looked up
- in the symbol table. If the identifier is not found in the symbol table, it
- is not a macro and scanning continues.</p>
- <p>If the identifier is found, the value of a flag associated with the identifier
- is used to determine if the identifier is available for expansion. If it is
- not, the specific token (i.e. the specific instance of the identifier) is marked
- as disabled and is not expanded. If the identifier is available for expansion,
- the value of a different flag associated with the identifier in the symbol table
- is used to determine if the identifier is an object-like or function-like macro.
- If it is an object-like macro, it is expanded. If it is a function-like macro,
- it is only expanded if the next token is an left parenthesis.<br>
- An identifier is available for expansion if it is not marked as disabled and
- if the the value of the flag associated with the identifier is not set, which
- is used to determine if the identifier is available for expansion.</p>
- <p>(If a macro is an object-like macro, skip past the next two paragraphs.)</p>
- <p>If a macro to be expanded is a function-like macro, it must have the exact
- number of actual arguments as the number of formal parameters required by the
- definition of the macro. Each argument is recursively scanned and expanded.
- Each parameter name found in the replacement list is replaced by the expanded
- actual argument after leading and trailing whitespace and all placeholder tokens
- are removed unless the parameter name immediately follows the stringizing operator
- (<tt>'#'</tt>) or is adjacent to the token-pasting operator (<tt>'##'</tt>).</p>
- <p>If the parameter name immediately follows the stringizing operator (<tt>'#'</tt>),
- a stringized version of the unexpanded actual argument is inserted. If the parameter
- name is adjacent to the token-pasting operator (<tt>'##'</tt>), the unexpanded
- actual argument is inserted after all placeholder tokens are removed.</p>
- <p>All concatenation takes place in the replacement list. (If a single concatenation
- yields multiple tokens, the behavior is undefined. Moreover, <tt>Wave</tt> in
- normal C++98 and C99 modes issues an error, if more then one token is produced
- as the result of the concatenation. In C++0x mode <tt>Wave</tt> treats token-pasting
- of unrelated tokens as well defined and inserts the reparsed string representation
- of the concatenated tokens into the replacement list.).</p>
- <p>The flag in the symbol table entry associated with the name of the macro being
- expanded is set to indicate the that the macro is not available for expansion.</p>
- <p>The replacement list is rescanned for further macro expansion. All leading
- and trailing whitespace tokens in the replacement list are removed (the placeholder
- tokens are left intact). </p>
- <p>After rescanning completes, the flag in the symbol table entry associated with
- the name of macro being expanded is cleared to indicate that the macro is again
- available for expansion, and the sequence of tokens that constitutes the rescanned
- replacement list is returned to the point of invocation of the macro.</p>
- <p>If this sequence of tokens is empty, it is replaced by a placeholder token.
- If a placeholder is found during scanning (or rescanning) it is ignored. (Also,
- if the only thing separating a parameter from the stringizing operator or token-pasting
- operator is placeholder, it is also ignored in that context.)</p>
- <p>This sequence of tokens is inserted at the original point that the macro was
- invoked, and scanning continues starting with the last token of the newly inserted
- sequence of tokens. I.e. scanning looks back a single token (possibly a placeholder
- token) and continues.<br>
- </p>
- <table border="0">
- <tr>
- <td width="10"></td>
- <td width="30"><a href="../index.html"><img src="theme/u_arr.gif" border="0"></a></td>
- <td width="30"><a href="predefined_macros.html"><img src="theme/l_arr.gif" border="0"></a></td>
- <td width="30"><a href="compiletime_config.html"><img src="theme/r_arr.gif" border="0"></a></td>
- </tr>
- </table>
- <hr size="1">
- <p class="copyright">Copyright © 2003-2011 Hartmut Kaiser<br>
- <br>
- <font size="2">Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) </font> </p>
- <span class="updated"></span>
- <p class="copyright"><span class="updated">Last updated:
- <!-- #BeginDate format:fcAm1m -->Sunday, May 15, 2005 12:23<!-- #EndDate -->
- </span>
- </p>
- <p> </p>
- </body>
- </html>
- <!-- #BeginDate format:fcAm1m -->Saturday, February 25, 2006 15:46<!-- #EndDate -->
|