Вложенная функция обратного вызова в C
Я написал код для вызова вложенных функций с помощью обратного вызова. Но я не получаю ожидаемого результата.
Пожалуйста, посмотрите код:
#include <stdio.h>
#include <stdlib.h>
typedef int (*f_ptr)(int a, int b);
typedef int (*pair_ptr)(f_ptr);
pair_ptr cons(int a, int b)
{
int pair(f_ptr f)
{
return (f)(a, b);
}
return pair;
}
int car(pair_ptr fun)
{
int f(int a, int b)
{
return a;
}
return fun(f);
}
int main()
{
int a = 3;
int b = 4;
// It should print value of 'a'
printf("%d", car(cons(a, b))); // Error : It is printing '0'
return 0;
}
Я также пробовал использовать указатель функции, но при этом получаю тот же результат, что и выше.
2 ответа
Попробуйте это (возможно, переместите функции и переменные, связанные с закрытием, в их собственный файл):
#include <stdio.h>
typedef int (*f_ptr)(int a, int b);
typedef int (*pair_ptr)(f_ptr);
static int PairA, PairB;
static void setPairA(int a) { PairA = a; }
static void setPairB(int b) { PairB = b; }
int f(int a, int b) {
(void)b; // removed unused parameter warning
return a;
}
int pair(f_ptr fp) {
return fp(PairA, PairB);
}
pair_ptr cons(int a, int b) {
setPairA(a);
setPairB(b);
return pair;
}
int car(pair_ptr fun) {
return fun(f);
}
int main(void) {
int a = 3;
int b = 4;
printf("%d\n", car(cons(a, b)));
return 0;
}
Обратите внимание, что pair()
не является реентерабельным, и вы не можете вызывать его с разными значениями для PairA
и / или PairB
в то же время.
C не поддерживает вложенную функцию, но расширение GCC поддерживает. В документах говорится:
Если вы попытаетесь вызвать вложенную функцию через ее адрес после выхода из содержащей ее функции, все вырвется наружу.
pair
пытается использовать a
а также b
которые больше не существуют. GCC может предоставлять вложенные функции, но они не обеспечивают закрытие. Это означает, что значенияa
а также b
не захватываются функцией; это просто адрес, возвращаемыйcons
.