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)] */