Boost logo

Boost :

Subject: Re: [boost] Review Request: Variadic Macro Data library
From: Lorenzo Caminiti (lorcaminiti_at_[hidden])
Date: 2011-02-21 12:12:15


On Mon, Feb 21, 2011 at 9:19 AM, Edward Diener <eldiener_at_[hidden]> wrote:
> On 2/21/2011 4:05 AM, Paul Mensonides wrote:
>>
>> On Sun, 20 Feb 2011 20:25:43 -0500, Edward Diener wrote:
>>
>>> I think Paul Mensonides may be right and there is no foolproof way to
>>> check for a completely empty parameter list even using variadic macros.
>>> Further ideas ?
>>
>> Trust me, I am right.  About the best you can do is prohibit input that
>> terminates in a function-like macro name.  You can generally detect
>> emptiness *except* for that case.
>>
>> However, DATA_SIZE() =>  0 is ill-conceived.  An empty argument is still
>> an argument to the preprocessor.  A better correlation is:
>>
>> DATA_SIZE(,,) =>  3
>> DATA_SIZE(,) =>  2
>> DATA_SIZE() =>  1
>
> Thanks ! I will just have to further document that the data size returned
> can never be 0, even when the variadic macro is invoked with an empty
> argument.

IMO, that makes sense -- so documentation is a good option.

However, I still don't understand why MSVC accepts this DATA_SIZE() invocation:

#define DATA_SIZE(...)
DATA_SIZE(1)
DATA_SIZE() // No error -- why??

#define SIZE(x)
SIZE(1)
SIZE() // Error -- as it should!

E:\sandbox\boost-sandbox\local\libs\local\example>cl /EHs /I"c:\Program Files\bo
ost\boost_1_45_0" /I..\..\.. 01.cpp /EP
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

01.cpp

01.cpp(8) : warning C4003: not enough actual parameters for macro 'SIZE'

I would think that DATA_SIZE() should error (like SIZE() correctly
does) because it is invoked with an empty macro parameter...

Why does the variadic DATA_SIZE() not error on MSVC given that MSVC
does not support empty macro parameters?

-- 
Lorenzo

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