Detect presence or absence of arguments in a C macro

c, c-preprocessor, variadic-macros

Solution

In C99 it is possible to detect if a macro argument is empty, but making that robust against all odds that may appear in that argument (arguments that are themselves expanding, contain `()` and stuff like that) is difficult. My macro package P99 implements such a thing, so you wouldn't have to worry too much. With that your macro can be implemented as

#define IFARGS(YES, NO, ...) P99_IF_EMPTY(__VA_ARGS__)(YES(__VA__ARGS__))(NO())

As its name indicates, P99 is only building on C99 features for that.

Problem

How can one define a C macro `IFARGS(YES, NO, ...)` such that invoking `IFARGS` with no additional arguments produces `NO`, and invoking `IFARGS` with one or more arguments produces `YES`? I have an answer using GCC (see below), but I'd prefer one for C99 if possible (or a proof of its impossibility).

Original source

Related problems