Re: the problem about different treatment to __VA_ARGS__ when using VS 2008 and GCC

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Liu Liu <ll2ef@xxxxxxxxxxxx> writes:

> I am trying to identify a problem because of an unusual usage of
> variadic macros. Here is the hypothetic macro:
>
> #define va(c, d, ...) c(d, __VA_ARGS__)
> #define var(a, b, ...)  va(__VA_ARGS__, a, b)
>
> var(2, 3, printf, “%d %d %d\n”, 1);
>
> For gcc, the preprocessor will output
>
> printf("%d %d %d\n", 1, 2, 3)
>
> but for VS 2008, the output is
>
> printf, “%d %d %d\n”, 1(2, 3);
>
> I suspect the difference is caused by the different treatment to
> __VA_ARGS__, for gcc, it will first expand the expression to
> va(printf, "%d %d %d\n", 1, 2, 3), and treat 1, 2, 3 as the
> __VA_ARGS__ for macro va. But for VS 2008, it will first treat b as
> __VA_ARGS__ for macro va, and then do the expansion.
>
> Which one is correct interpretation for C99 variadic macro? or my
> usage falls into an undefined behavior? Thank you.

I'm pretty sure that gcc is right.  The C99 standard says that first
you replace the macro with its definition and do all argument
substitution.  Then you rescan the resulting text for any further
macros.

Ian


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux