Files
preprocessor/doc/problems_with_compilers.htm

127 lines
4.7 KiB
HTML
Raw Normal View History

2001-11-25 18:32:11 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Boost PREPROCESSOR library</TITLE>
<BODY bgcolor="#ffffff">
<a href="index.htm"><IMG height=86
alt="c++boost.gif (8819 bytes)"
src="../../../c++boost.gif"
width=277 align=center></a>
<hr>
<h1>Boost PREPROCESSOR library:&nbsp;Known problems with specific compilers</h1>
<p> Some compilers have buggy or limited preprocessors. This page explains known
problems with specific compilers.</p>
<hr>
<h2>Contents</h2>
<ul>
<li><a href="#Metrowerks Codewarrior 7.0">Metrowerks Codewarrior 7.0</a></li>
2001-11-27 04:30:22 +00:00
<li><a href="#Comeau C/C++ 4.2.45.2">Comeau C/C++ 4.2.45.2 for Windows</a></li>
2001-11-25 18:32:11 +00:00
</ul>
<HR>
2001-11-27 04:30:22 +00:00
2001-11-25 18:32:11 +00:00
<h3><a name="Metrowerks Codewarrior 7.0">Metrowerks Codewarrior 7.0</a></h3>
2001-11-27 04:30:22 +00:00
<p>Metrowerks Codewarrior 7.0 has a bug in preprocessor (to be more
2001-11-25 18:32:11 +00:00
concrete, in function-like macro replacement mechanism) that restricts usage
of the library to only very simple cases, at least if you don't write code that
specifically address this issue; for example, the above NUMBERED_EXPRESSION
example doesn't compile on CW 7.0. Below is a simple test case that reproduces
the bug:</p>
<blockquote>
<pre>#define IDENTITY_MACRO(x) IDENTITY_MACRO_BODY(x)
#define IDENTITY_MACRO_BODY(x) x
#define COMMA_TOKEN() ,
int a IDENTITY_MACRO(COMMA_TOKEN)() b; // this works
int c IDENTITY_MACRO(IDENTITY_MACRO(COMMA_TOKEN))() d; // this doesn't
</pre>
</blockquote>
<p>Basically, what's happening here is that function-like COMMA_TOKEN macro gets
expanded _inside_ of the nested IDENTITY_MACRO call - even although it's NOT
followed by a '(' as the next preprocessing token - which is a clearly an incorrect
behavior (see 16.3 [cpp.replace] para 9 for the detailed description of the
2001-11-27 04:30:22 +00:00
function-like macro replacement process). I've submitted a bug report, but they
haven't confirmed it yet.</p>
2001-11-25 18:32:11 +00:00
<p>So, this is not a problem of the library, but probably something that needs
to be mentioned in the documentation, may be with some examples of how to workaround
the issue. Just to show one possible way around the problem, here is a NUMBERED_EXPRESSION
macro that does work on MWCW:</p>
<blockquote>
<pre>#define NUMBERED_EXPRESSION(n, x) \
BOOST_PREPROCESSOR_CAT(BOOST_, \
BOOST_PREPROCESSOR_IF( \
n \
, PREPROCESSOR_IDENTITY(x##n) \
, PREPROCESSOR_EMPTY \
))() \
/**/
</pre></blockquote>
<p align="right"><i>Reported by Aleksey Gurtovoy</i></p>
2001-11-27 04:30:22 +00:00
<h3><a name="Comeau C/C++ 4.2.45.2">Comeau C/C++ 4.2.45.2 for Windows</a></h3>
<p>It appears that their algorithm of macro call invocation is quite far
from ideal, because for the following code fragment (which is a part of
<a href="../test/preprocessor_test.cpp">preprocessor_test.cpp</a>), the
linear increasing of IS_FUNCTION_HELPER_TEST_MAX value leads to not even
quadratic, but something like exponential increasing of compilation time!
(see the timing data below). This behavior may or may not be problematic
for you, depending on how intense is your usage of the library.
<blockquote>
<pre>#ifndef IS_FUNCTION_HELPER_TEST_MAX
#define IS_FUNCTION_HELPER_TEST_MAX 40
#endif
typedef char yes_type;
#define IS_FUNCTION_HELPER(I,A)\
template\
&ltBOOST_PREPROCESSOR_ENUM_PARAMS(BOOST_PREPROCESSOR_INC(I),class P)&gt;\
yes_type is_function_helper(\
P0 (*)(BOOST_PREPROCESSOR_ENUM_SHIFTED_PARAMS(BOOST_PREPROCESSOR_INC(I),P)));
BOOST_PREPROCESSOR_REPEAT_2ND(BOOST_PREPROCESSOR_INC(IS_FUNCTION_HELPER_TEST_MAX),IS_FUNCTION_HELPER,A)
#undef IS_FUNCTION_HELPER
</pre></blockquote>
<h4>Timing data:</h4>
<table border="1">
<tr align="center">
<th>&nbsp;</th>
<th>Comeau C/C++ 4.2.45.2</th>
<th>Microsoft Visual C++ 6.0 SP5</th>
</tr>
<tr align="center">
<td>10 parameters</td>
<td><font color="red">&lt; 1 sec</font></td>
<td>&lt; 1 sec</td>
</tr>
<tr align="center">
<td>20 parameters</td>
<td><font color="red">~ 2 sec</font></td>
<td>&lt; 1 sec</td>
</tr>
<tr align="center">
<td>30 parameters</td>
<td><font color="red">~ 15 sec</font></td>
<td>&lt; 1 sec</td>
</tr>
<tr align="center">
<td>40 parameters</td>
<td><font color="red">~ 50 sec</font></td>
<td>&lt; 1 sec</td>
</tr>
</table>
<p align="right"><i>Reported by Aleksey Gurtovoy</i></p>
2001-11-25 18:32:11 +00:00
<hr>
<P><EFBFBD> Copyright Housemarque, Inc. 2001</P>
<p>Permission to copy, use, modify, sell and distribute this document is granted
provided this copyright notice appears in all copies. This document is provided
"as is" without express or implied warranty, and with no claim as to its suitability
for any purpose. </p>
<p>Updated: <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %b %Y" startspan --><!--webbot bot="Timestamp" endspan i-checksum="15246" --></p>
<p></p>
</BODY></HTML>