Boost logo

Boost :

Subject: Re: [boost] Review Request: Variadic Macro Data library
From: Paul Mensonides (pmenso57_at_[hidden])
Date: 2011-02-21 14:44:24


On Mon, 21 Feb 2011 13:22:41 -0600, Hartmut Kaiser wrote:

>> #define MACRO(...) [__VA_ARGS__]
>>
>> MACRO() // [<placemarker>] -> []
>> MACRO( ) // [<placemarker>] -> []
>> MACRO(a) // [a]
>> MACRO(a,b) // [a,b]
>> MACRO(a, b) // [a, b]
>> MACRO( a,b, c ) // [ a,b, c ]
>>
>> * Note that I don't know of a single preprocessor that actually handles
>> whitespace correctly in all cases.
>
> Damn, I know I had that right in Wave at some point. Must have broken it
> later... And apparently there are no tests in Wave verifying this is
> functioning as expected.
>
> I'll fix both things asap.

Note that there is only one way that the lack of proper handling can
effect the semantics of a program: stringizing. Further, it must
internal whitespace because stringizing removes leading and trailing
whitespace and condenses adjacent internal whitespace by definition--
which you can get because the normal whitespace condensation happens in
an earlier separate phase:

#define A(x) 1 x 3

A(2) // 1 2 3
A( 2 ) // 1 2 3

When stringized these both result in "1 2 3". However, something like
this is where things change:

#define B(x) (1)x(3)

STRINGIZE(B(3)) // "(1)3(2)"
STRINGIZE(B( 3 )) // "(1) 3 (2)" -- aha! different semantics

Other than scenarios like that, it makes no effective difference.

Regards,
Paul Mensonides


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