Может целесообразнее описывать функции f и g на том же C++ в отдельном файле и пересобирать исполняемый файл каждый раз под конкретную задачу, например с помощью скрипта
#/bin/bash
gcc -o $1 -lm -lstdc++ solver.o $1.cpp
./$1
где $1 -- аргумент скрипта -- имя файла с реализацией конкретных f и g без расширения
solver.o -- предварительно скомпилированное вычислительное ядро