首页 > 解决方案 > 如何在没有静态函数的情况下在 C 中将函数作为参数?

问题描述

在 JavaScript 中,我可以简单地做类似的事情runCode((arg1) => { sampleFunction(arg1); }),但我不能在 C 中做到这一点。我尝试在函数中声明函数作为一种解决方法(因为我正在制作一个只用它自己做事情的函数),但它没有t 似乎工作。

标签: c

解决方案


在 C 中,您将传递一个函数指针:

void f(int arg1) {
}


void f2(void (*fp)(int), int arg1) {
  fp(arg1);
}


int main() {
  f2(&f, 42);
  return 0;
}

您需要将数据作为单独的参数传递。如果您希望 f2 支持不同的函数签名,您可以通过传入union每种类型的 a 来实现。在实践中,您经常会看到 struct 通过 void 指针传入:

  f3(void (*fp)(union { struct a a, struct b b} *data), union { struct a a, struct b b} *data);
  f4(void (*fp)(void *data), void *data);

f3 将在编译时进行类型检查,而 f4 将在运行时失败,如果您尝试将数据转换为错误的类型。

如果您想在运行时创建一个函数,那么您将不得不以某种方式生成目标代码(即通过编译一个函数,通过 dlopen 加载它可能)。很少这样做。


推荐阅读