c++boost.gif (8819 bytes)

Boost PREPROCESSOR library: Known problems with specific compilers

Some compilers have buggy or limited preprocessors. This page explains known problems with specific compilers.


Contents


Metrowerks Codewarrior 7.0

Bad news - Metrowerks Codewarrior 7.0 has a bug in preprocessor (to be more 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:

#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

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 function-like macro replacement process). I haven't submitted bug report yet, but I am going to.

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:

#define NUMBERED_EXPRESSION(n, x) \
    BOOST_PREPROCESSOR_CAT(BOOST_, \
    BOOST_PREPROCESSOR_IF( \
      n \
    , PREPROCESSOR_IDENTITY(x##n) \
    , PREPROCESSOR_EMPTY \
    ))() \
/**/

Reported by Aleksey Gurtovoy


© Copyright Housemarque, Inc. 2001

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.

Updated: