include <iostream>
int foo1()
{
return(0);
}
int foo2(int val)
{
return(val);
}
#define PROTOTYPE_BUILDER(p_return_type, p_function_name, p_parameters) \
#p_return_type" "#p_function_name"["#p_parameters
#define foo1_prototype PROTOTYPE_BUILDER(int, foo1, ())
#define foo2_prototype PROTOTYPE_BUILDER(int, foo2, (int val))
#define HOOK_BUILDER(p_function_name, ...) \
({ std::cout \
<< p_function_name##_prototype \
<< " = ("#__VA_ARGS__")]" << std::endl;\
p_function_name(__VA_ARGS__); })
#define foo1(...) HOOK_BUILDER(foo1, __VA_ARGS__)
#define foo2(...) HOOK_BUILDER(foo2, __VA_ARGS__)
int main()
{
foo1();
return(foo2(1));
}
/*
int foo1[() = ()]
int foo2[(int val) = (1)]
*/