c - 如何在没有静态函数的情况下在 C 中将函数作为参数?
问题描述
在 JavaScript 中,我可以简单地做类似的事情runCode((arg1) => { sampleFunction(arg1); })
,但我不能在 C 中做到这一点。我尝试在函数中声明函数作为一种解决方法(因为我正在制作一个只用它自己做事情的函数),但它没有t 似乎工作。
解决方案
在 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 加载它可能)。很少这样做。
推荐阅读
- c# - ASP.Net Core 3.1 中的非字符串配置?
- elasticsearch - EsSparkSQL$.saveToES 方法中发生 NoSuchMethodError
- swift - 从 '(_, _) throws -> ()' 类型的抛出函数到非抛出函数类型 '(Bool, Error?) -> Void 的无效转换
- mysql - 如何在 nodejs postgres/mysql 中查看已连接服务器的所有数据库
- python - 如何使用 flask-migrate 迁移具有不同表的多数据库
- payment-gateway - Google Pay 付款数据不包含交易金额
- javascript - 在 NaN 中添加数字结果
- php - 将数组插入数组集合而不循环
- r - 查看内部/未导出函数的文档?
- sql - 如何使用另一个表 B 中的值更新表 A 中的列,其中表 A 和 B 之间的关系是 1:N,使用 max() 函数