| <!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-2010 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 --> |