Boost logo

Boost :

From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2005-07-15 00:06:36


David Abrahams <dave_at_[hidden]> writes:

> I am defining a macro,
>
> BOOST_PARAMETER_KEYWORD(tag_namespace, name)
>
> that declares a keyword for the Parameter library. It has to be used
> at namespace scope. I have the option to define it so that correct
> usage requires a trailing semicolon, or so that the trailing semicolon
> is forbidden. Unfortunately I don't have the ability to make it
> optional. Which should I choose?
>
> IMO there's no chance of confusing it with a function call, since a
> function call would be illegal in the context in which it's used, and
> people are naturally more likely to add a semicolon without thinking
> about it, and if I design the macro so that a semicolon is required it
> will interact more smoothly with editors and pretty-printers. So I
> can't see any good reason not to require the semicolon. Arguments?

OK, here's a argument against: requiring the semicolon makes it
impossible to define a macro that expands to nothing. For instance, if
we required the semicolon in BOOST_MPL_AUX_LAMBDA_SUPPORT:

    template< typename T, typename U = int > struct f
    {
        typedef T type[sizeof(U)];
        BOOST_MPL_AUX_LAMBDA_SUPPORT(2, f, (T,U));
                                                ^^
    };

then for comforming compilers we would have to come up with something
like

    #define BOOST_MPL_AUX_LAMBDA_SUPPORT( arity, name, args ) \
    typedef BOOST_PP_CAT( ugly_ugly_hack, __LINE__ ) \
    /**/

and hope that user will never have a class member named
'ugly_ugly_hackNN'. Besides being conceptually unclean and
theoretically conflict-prone, this would also have an unpleasant
effect of not being able to get a "clean" version of the code by
simply preprocessing the file under a proper configuration (the MPL
way to generate "ideal" versions of the preprocessed headers for
conforming compilers).

-- 
Aleksey Gurtovoy
MetaCommunications Engineering

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk