所以这个简单的例子只是在传递一个函数时打印出3
:
#include <stdio.h>
int
add(int a, int b) {
return a + b;
}
int
case_1_fn_a(int fn_x(int, int)) {
return fn_x(1, 2);
}
int
main() {
int x = case_1_fn_a(add);
printf("%d\n", x);
return 0;
}
但现在我想将一个函数传递给一个函数。我该怎么做?
#include <stdio.h>
int
add(int a, int b) {
return a + b;
}
int
case_2_fn_a(int fn_x(int, int), int fn_y(int, int)) {
return add(fn_x(add, add), fn_y(add, add));
}
int
case_2_fn_b(int fn_x(int, int)) {
return fn_x(1, 2);
}
int
main() {
int x = case_2_fn_a(case_2_fn_b, case_2_fn_b);
printf("%d\n", x);
return 0;
}
但是我得到了这些错误(如果我尝试调整这个或那个东西,我会得到各种不同的错误,所以没有任何效果):
tmp.c:11:19: warning: incompatible pointer to integer conversion passing 'int (int, int)' to parameter of type 'int' [-Wint-conversion]
return add(fn_x(add, add), fn_y(add, add));
^~~
tmp.c:11:24: warning: incompatible pointer to integer conversion passing 'int (int, int)' to parameter of type 'int' [-Wint-conversion]
return add(fn_x(add, add), fn_y(add, add));
^~~
tmp.c:11:35: warning: incompatible pointer to integer conversion passing 'int (int, int)' to parameter of type 'int' [-Wint-conversion]
return add(fn_x(add, add), fn_y(add, add));
^~~
tmp.c:11:40: warning: incompatible pointer to integer conversion passing 'int (int, int)' to parameter of type 'int' [-Wint-conversion]
return add(fn_x(add, add), fn_y(add, add));
^~~
tmp.c:21:23: warning: incompatible pointer types passing 'int (int (*)(int, int))' to parameter of type 'int (*)(int, int)'
[-Wincompatible-pointer-types]
int x = case_2_fn_a(case_2_fn_b, case_2_fn_b);
^~~~~~~~~~~
tmp.c:10:17: note: passing argument to parameter 'fn_x' here
case_2_fn_a(int fn_x(int, int), int fn_y(int, int)) {
^
tmp.c:21:36: warning: incompatible pointer types passing 'int (int (*)(int, int))' to parameter of type 'int (*)(int, int)'
[-Wincompatible-pointer-types]
int x = case_2_fn_a(case_2_fn_b, case_2_fn_b);
^~~~~~~~~~~
tmp.c:10:37: note: passing argument to parameter 'fn_y' here
case_2_fn_a(int fn_x(int, int), int fn_y(int, int)) {
^
6 warnings generated.
Segmentation fault: 11
本质上,我想将一系列函数传递给函数“A”,然后让函数“A”获取这些函数(我们称它们为函数“B”、“C”和“D”),然后调用 < em>它们带有一些函数作为参数。函数“B”、“C”和“D”然后获取它们的函数参数,并将简单的值传递给它们,比如整数或字符。
最佳答案
首先,当将函数作为参数传递时,您通常希望改用函数指针。所以不要将其作为参数:
int fn_x(int, int)
你会用这个:
int (*fn_x)(int, int)
现在是主要问题:作为参数和返回值的函数(和函数指针)可能具有令人困惑的语法。为函数指针创建 typedef 大大简化了这一点。
所以让我们做以下类型定义:
typedef int (*addfunc)(int, int);
typedef int (*fnb)(addfunc);
typedef int (*fna)(fnb, fnb);
现在你有:
int
case_2_fn_a(fnb fn_x, fnb fn_y) {
return add(fn_x(add), fn_y(add));
}
int
case_2_fn_b(addfunc fn_x) {
return fn_x(1, 2);
}
如您所见,语法更加简洁。更明显的是,case_2_fn_a
的主体有一个错误,其中 fn_x
和 fn_y
被传递了两个参数而不是一个。
如果您真的想在没有 typedef 的情况下执行此操作,case_2_fn_a
将如下所示:
int
case_2_fn_a(int (*fn_x)(int (*)(int,int)), int (*fn_y)(int (*)(int,int))) {
return add(fn_x(add), fn_y(add));
}
关于c - 如果传递的函数也将函数作为参数,如何将函数作为参数传递给 C 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59059344/