Cで引数の個数の違いによる多重定義を偽装する

幾つか制限はあるけど、見かけだけ、多重定義されているように見せかける方法を思いついた。


以下テストコード

#include <stdio.h>

void foo0(void)
{
  printf("foo0だよ\n");
}
void foo1(int x)
{
  printf("foo1:x=%dだよ\n",x);
}
void foo2(int x, int y)
{
  printf("foo2:x=%d,y=%dだよ\n",x,y);
}

#define foo(...) 						\
  (void (*[])()){foo0,foo1,foo2}				\
  [sizeof((int[]){0,__VA_ARGS__})/sizeof(int)-1](__VA_ARGS__)	\

#if 0 // VC用
#define foo(...) 				\
{					\
  void (*func[])() ={foo0,foo1,foo2};	\
  int s[] = {0,__VA_ARGS__};		\
  func[sizeof(s)/sizeof(int)-1](__VA_ARGS__);	\
}
#endif
int main()
{
  foo();
  foo(1);
  foo(3,4);
  return 0;
}