6521b47fc7
[SVN r68004]
102 lines
6.1 KiB
HTML
102 lines
6.1 KiB
HTML
<!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 --> |