Question

After reading about VA_NARG

I tried to implement function overloading depending on number of arguments in C using macros. Now the problem is:

void hello1(char *s) { ... }
void hello2(char *s, char *t) { ... }
// PP_NARG(...)           macro returns number of arguments :ref to link above
 // does not work
#define hello(...)         hello ## PP_NARG(__VA_ARGS__)  

int main(void)
{
   hello("hi");   // call hello1("hi");
   hello("foo","bar"); // call hello2("foo","bar");
   return 0;
}

I've read this from C-faq. But still could not get it to work...

Was it helpful?

Solution

This is because of the evaluation rules for macros. You would have to define some sort of helper macro that receives the number as a token:

#define HELLO_1(N, ...)         hello ## N
#define HELLO_0(N, ...)         HELLO_1(N, __VARGS__)
#define HELLO(...)         HELLO_0(PP_NARG(__VA_ARGS__), __VARGS__)  

or so. You could also have a glance into the prerelease of the documentation of P99. This will provide you more comfortable macro tools to do that directly.

OTHER TIPS

That PP_NARG is a rather impressive piece of craziness!

Following the glue example in the C99 standard (6.10.3.5, example 4), the following produces the desired results:

#define glue(a, b)   a ## b
#define xglue(a, b)  glue(a, b)

#define hello(...)   xglue(hello, PP_NARG(__VA_ARGS__))(__VA_ARGS__)

I don't have a C99 compiler available to check, but this should work:

#define helloN(N, ...) hello ## N (__VA_ARGS__)
#define hello(...) helloN(PP_NARG(__VA_ARGS__), __VA_ARGS__)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top