Another C99 abuse: named formal parameters:
int foo(int a, char b)
{
        printf("foo: a: %i, b: %c (%i)\n", a, b, b);
}
#define foo(...) ({                 \
          struct {                  \
                   int  a;          \
                   char b;          \
          } __fa = { __VA_ARGS__ }; \
          foo(__fa.a, __fa.b);      \
})
int main(int argc, char **argv)
{
        foo(.b = 'b', .a = 42);
        foo();
}This outputs:
foo: a: 42, b: b (98)
foo: a: 0, b:  (0)By combining compound literals and __VA_ARGS__ (again!) it is possible to explicitly name function arguments, specify them in arbitrary order, and omit some of them (omitted arguments are initialized by corresponding default initializers).