c - 如果传递的函数也将函数作为参数,如何将函数作为参数传递给 C 中的函数?

标签 c function pointers parameter-passing

所以这个简单的例子只是在传递一个函数时打印出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_xfn_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/

相关文章:

c - 新手使用 malloc 处理 char

c - 学习C——指针和内存寻址

javascript - 访问对象中的函数,嵌套在另一个函数中

c++ - 校验数字的递归函数

swift - 解析 - 查询 'includeKey' 未在正确的子类中获取对象

c++ - 更新指针?

iphone - 为使用 OpenMP 的 iOS 编译静态库

java - 在android中的webrtc中使用噪声抑制模块

c - 使用 strcmp 比较字符指针和文字

python - 定义 python apply 函数,它可以访问前一行的值并将它们用于计算