I wrote:
> > -       void *__obj = (void *) (OBJ);                                       
> >       \
> > +       void *__obj = OBJ;                                                \
> 
> Here, there is still a need for parentheses around OBJ, namely when
> this macro is used in C++ mode and OBJ is something like
>   new FooBar<int,long>()
> with at least two template parameters.

Oops, in C++ you can't even pass
  new FooBar<int,long>()
as a single macro parameter. So, my rationale was nonsense.

Instead, the parentheses are there to follow the habit / convention
to parenthesize expression-typed macro arguments everywhere. This convention
exists in order to avoid unintended expression structure in cases like
  (X * X)
or
  (- X)
when X is   a + b

Bruno




Reply via email to