If you don&#x27;t need the return value, the do-while approach works as you suggested:<p><pre><code>  #define bar(...) do {		                   	 \
	const char *_args[] = {NULL, __VA_ARGS__};       \
	bar(sizeof(_args)&#x2F;sizeof(*_args) - 1, _args + 1);\
  } while (0)
</code></pre>
If for some absurd reason you really do need to emulate a &quot;compound statement expression&quot; in MSVC (because you need to declare some temp variables in a macro that can be used for assignment), it turns out that it can be done with a &quot;lambda expression&quot;:<p><pre><code>  #include &lt;stdio.h&gt;

  int bar(int n, const char *p[])
  {
    int total = 0; 
    for (int i = 0; i &lt; n; i++) {
      total += printf(&quot;%s\t&quot;, p[i]);
    }
    putchar(&#x27;\n&#x27;);
    return total;
  }

  #define bar(...) [](){                                       \
    const char *_args[] = {NULL, __VA_ARGS__};                 \
    return bar(sizeof(_args)&#x2F;sizeof(*_args) - 1, _args + 1);   \
  }()

  int main(&#x2F;* int argc, char **argv *&#x2F;) {
    int total = 0;
    total += bar();
    total += bar(&quot;a&quot;);
    total += bar(&quot;a&quot;, &quot;b&quot;);
    total += bar(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;);
    printf(&quot;total: %d\n&quot;, total);
    return 0;
  }</code></pre>