Прежде всего, обратите внимание, что функции с переменными аргументами, в частности, почти наверняка являются неправильным решением любой проблемы. Их следует рассматривать как устаревшую, опасную функцию - избегайте их, если это возможно.
Как говорится, вы можете решить свою проблему, создав единую универсальную функцию, которая принимает параметр указателя функции:
typedef void lib_log_func_t (char* buf);
void lib_log (lib_log_func_t* func, const char* format, ...)
{
char log_buf[256] = {0};
va_list args;
vsprintf(log_buf, format, args);
va_end(args);
func(log_buf);
}
Затем напишите 3 макроса-оболочки:
#define INFO(format, ...) lib_log(LIB_LOG_INFO, format, __VA_ARGS__)
#define ERROR(format, ...) lib_log(LIB_LOG_ERROR, format, __VA_ARGS__)
#define DEBUG(format, ...) lib_log(LIB_LOG_ERROR, format, __VA_ARGS__)