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
