Ну тогда так: Добавить массив целых по числу функций. Каждый бит - это какое-то условие (если 16 условий хватит).
enum func_flag {
func_cond1 = 0x01, func_cond2 = 0x02,
func_cond3 = 0x04 // и т.д., имена, естественно, осмысленные
};
unsigned flags[] = {
func_cond1 | func_cond3 // первая функция блокируется в этих случаях
func_cond_4, // и т.д.
func_cond_2 | func_cond_5,
...
};
unsigned current_flags = 0; // сначала всё разрешено
void call_func(unsigned char i)
{
if( flags[i] & current_flags)
return; // заблокировано
(arr[i])();
}