The example does not actually use compound literals.  (i.e. _arg&#x27;s initializer would work in C89.)  It does use two other C99 features, though -- variadic macros and a for-loop-scoped variable declaration.  The biggest compatibility issue, though, are its use of GCC extensions:<p>- Statement expressions: e.g.: int x = ({ int y = 0; y; });<p>- If zero-args are allowed (e.g. bar()), then _args is 0-sized, which is also non-standard.<p>These GCC extensions are somewhat common.  Clang has them, and (I think) EDG&#x27;s frontend does too.  MSVC does not have either of them, even in MSVC 2015.<p>That said, a compound literal might be a good way to remove the extension use, but as long as bar() returns void, the do-while(0) trick is also sufficient for replacing the statement expression.<p>I think this compound literal usage works:<p><pre><code>  #define bar(...) (bar( \
      sizeof((const char*[]) { NULL, __VA_ARGS__ }) &#x2F; sizeof(const char*) - 1, \
      (const char*[]) { NULL, __VA_ARGS__ } + 1))
</code></pre>
bar() results in trailing commas.  My impression is that C99 allows them in array initializers.  (I saw an example in the n1256 C draft.)  I don&#x27;t recall whether C89 also had them.  __VA_ARGS__ is expanded twice, but I think that&#x27;s OK, because sizeof() only evaluates its operand when it has VLA type, and it never will.  This code will work in MSVC 2013 (if not earlier).