Я бы сказал, что указатели на функции - это хорошо, но вы можете использовать препроцессор, чтобы делать то, что вы хотите ... (хотя научиться использовать указатели на функции - это хорошо) ...
Я имею в виду, что если param2 является чем-то статически известным, иметь указатели на функции довольно бесполезно. Указатели на функции были бы лучше, если у вас есть динамические значения и при запуске вашей программы, когда вы хотите задать param2 = foo param2 = bar ...
Вам действительно нужны разные прототипы функций, или у вас может быть что-то вроде ...
#ifdef BAR
void foo() { whatever(); }
#elif defined(FOO)
void foo() { whocares(); }
#else
#define foo() do{} while(0)
#endif
и всегда имеют одно и то же тело, но в командной строке вводится разное -D ...