【发布时间】:2019-10-15 03:02:33
【问题描述】:
我有高级语言的背景,例如 Java/Kotlin/Scala。现在我需要创建一个 C 库,但是没有闭包我很难工作。
GCC 中有一个很好的扩展,称为“嵌套函数”,(如果我理解正确的话)正是我所需要的。苹果的“blocks”扩展看起来也很有趣。但我需要一个代码,它适用于任何编译器。
是否存在任何现有的解决方案?我看过一些允许生成 C 代码的项目:https://github.com/dbohdan/compilers-targeting-c。但我真的不需要另一种语言,只需要一个特性——闭包。 (我认为很难维护完全不同的语言,结果 C 代码不会优化)。
UPD 一些解释,为什么我需要闭包。
假设我们有一些功能,connect(void (*on_failed_callback)());。它以某种方式管理连接,当连接丢失时,它会调用回调。它需要 0 个参数,但我想创建一些函数,它会带来一些带有回调的数据。如果我理解正确,最常用的解决方案是使用一些 arg connect(void (*on_failed_callback)(void *callback_arg), void* arg); 传递回调。但它会导致样板代码,可以通过嵌套函数来修复。
接下来的代码:
void connect(void (*on_failed_callback)(void* arg), void* arg) {
...
on_failed_callback(arg);
}
void print_error(char* error) {
printf(error);
}
void main() {
char *msg = "Failed connection";
...
connect(print_error, msg);
}
可以简化为下一个:
void connect(void (*on_failed_callback)()) {
...
on_failed_callback();
}
void print_error(char* error) {
printf(error);
}
void main() {
char* msg = "Failed connection";
...
void callback() {
print_error(msg);
}
connect(callback);
}
我的意思是,我想要一些工具/应用程序,用闭包/嵌套函数分析我的代码并生成纯 ANSI C 代码。
【问题讨论】:
-
没有。而且我看不出没有嵌套函数可以做什么。 C 是命令式语言,与函数式语言有很大不同。然而,我发现函数式编程知识对理解递归和函数纯度等概念有很大帮助,这可以增强而不是削弱 C 技能。
-
ANSI C(1990 年更名为 ISO C)不支持嵌套函数或闭包。因此,如果您使用 gcc 扩展,您的代码将无法与其他编译器一起使用。
-
无论如何,C 是一种相当低级的语言。从 70 年代的 K&R C 开始,它就旨在对编译器友好,而不是为程序员节省一些打字。如果你想要更多好东西,你将不得不转向 C++...
-
GCC 的嵌套函数不是正确的闭包,它们只能在其存活时引用它们的环境!
标签: c nested-function