C 中的嵌套回调函数
Nested callback function in 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;
}
我也尝试过使用函数指针,但我也得到了与上面相同的输出。
试试这个(也许将与 闭包 相关的函数和变量移动到它们自己的文件中):
#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
and/orPairB
的不同值调用
C 不支持嵌套函数,但 GCC 扩展支持。 docs 说:
If you try to call the nested function through its address after the containing function exits, all hell breaks loose.
pair
尝试使用不再存在的 a
和 b
。 GCC 可能提供嵌套函数,但它们不提供 closures。这意味着 a
和 b
的值不会被函数捕获;它只是 cons
.
返回的地址
我已经编写了一些使用回调调用嵌套函数的代码。 但是我没有得到预期的输出。
请查看代码:
#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;
}
我也尝试过使用函数指针,但我也得到了与上面相同的输出。
试试这个(也许将与 闭包 相关的函数和变量移动到它们自己的文件中):
#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
and/orPairB
的不同值调用
C 不支持嵌套函数,但 GCC 扩展支持。 docs 说:
If you try to call the nested function through its address after the containing function exits, all hell breaks loose.
pair
尝试使用不再存在的 a
和 b
。 GCC 可能提供嵌套函数,但它们不提供 closures。这意味着 a
和 b
的值不会被函数捕获;它只是 cons
.