Вам нужно использовать указатель на функцию.Синтаксис объявления указателя функции:
rettype (*)(paramtype1,paramtype2,...,paramtypeN)
Так, например, у нас может быть следующий код:
char functionA(int x)
{
printf("%d\n",x):
return 'a';
}
char functionB(char (*f)(int), int val)
{
return f(val); // invokes the function pointer
}
int main(int argc, char* argv[])
{
char result = functionB(&functionA,3); // prints "3"
printf("%c\n",result); // prints 'a'
return 0;
}
Кроме того, отметим, что в то время как & functionA принимаетадрес функции A, на самом деле нет необходимости использовать амперсанд там ... Я лично делаю это, так как я думаю, что это делает более ясным, что это указатель на функцию.Вы вызываете указатель на функцию, используя тот же синтаксис, что и при вызове функции.
Что касается использования буферов перехода, я считаю, что то, что вы делаете, не является чем-то, на что можно положиться.Если вы хотите создать буфер перехода и вызвать setjmp перед вызовом какой-либо функции, затем позже вызовите longjmp, чтобы вы вернулись к нему непосредственно перед вызовом, тогда это будет четко определено.Фактическое определение и структура jmp_buf, тем не менее, зависят от реализации.Существуют определенные требования, которым он должен соответствовать (например, это должен быть тип массива, поскольку setjmp должен иметь возможность принимать его по значению и все же изменять его), но кроме этого, спецификация для setjmp.h не определяет структуру jmp_buf.Итак, все, что пытается манипулировать jmp_buf напрямую, будет специфичным для конкретной платформы.