Boost logo

Boost :

Subject: Re: [boost] [Review:Contract] Andrzej's review
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2012-09-06 14:03:23


AMDG

On 09/06/2012 09:50 AM, Lorenzo Caminiti wrote:
>
> I was thinking more on how to support compiler-specific declaration
> extensions. Supposedly, the lib will not do anything with these but to
> repeat them verbatim when the macros expand the underlining C++ code
> (because these extensions do not affect Contract Programming).
> Therefore, I was thinking that I could support a generic verbatim(...)
> identifier that can appear anywhere within the declarations and will
> specify tokens that the lib will simply repeat "as is" in the actual
> C++ declarations of the expanded macros. For example:
>
> CONTRACT_CLASS(
> verbatim(__declspec(dllimport)) class (x)
> ) {
> CONTRACT_CLASS_INVARIANT( void )
> } varx;
>
> CONTRACT_CLASS(
> class verbatim(__declspec(dllimport)) (x)
> ) {
> CONTRACT_CLASS_INVARIANT( void )
> };
>
> If possible, this could be used to support a number of different
> (all?) compiler extensions because the lib doesn't need to know
> anything about the content of a verbatim clasule but just that the
> specified tokens have to be repeated "in place and as they are" when
> expanding the macros.
>

One difficulty with this is defining
exactly what "in place" means. You'll
need to specify how locations in your
syntax map to locations in the C++
declaration in all the places where
the syntax is different. e.g.

void (f)(int i, verbatim(extension) default 10)

a) void f(int i extension = 1)
b) void f(int i = extension 1)
c) This is illegal

> In contrast if I implement the code below, it will only work for
> __declspec and not for other extensions (because the lib needs to be
> aware of __declspec and not just of verbatim here):
>
> CONTRACT_CLASS(
> __declspec(dllimport) class (x)
> ) {
> CONTRACT_CLASS_INVARIANT( void )
> } varx;
>
> CONTRACT_CLASS(
> class __declspec(dllimport) (x)
> ) {
> CONTRACT_CLASS_INVARIANT( void )
> };
>
> What do you think?
>

I think both are good. You should implement
important known compiler extensions like
__declspec and __attribute__ directly and
also provide verbatim to handle unknown
or future compiler extensions.

In Christ,
Steven Watanabe


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