【发布时间】:2020-02-01 04:35:32
【问题描述】:
背景
这就是当你花几年时间编写 Haskell 然后回到裸机 C 代码时会发生的情况:
问题
函数是否可以将指针作为其返回类型,该指针与函数本身的类型相同?是这样,语法是什么?
函数的名称是否在函数体的范围内?或者我可以得到当前正在执行的函数的地址吗?
例如
void foo() {
callmeback(&foo); // is this legal
}
您为什么要这样做?
我有一个状态机来处理来自一些非常有限的控件的用户输入,这意味着这两个输入操作必须服务于几种不同的模式。我正在将充满 switch 语句和全局变量的意大利面条代码重构为更易于维护的东西。如果我在 Haskell 中工作,我会使用用户输入调用当前模式函数,并让它返回一个函数以使用后续输入调用——它本身或新模式的处理程序。我开始在 C 中执行此操作,并意识到我不知道如何编写处理函数的类型。如果这不起作用,我将简单地为下一个处理程序设置一个全局变量并继续生活,但我只需要询问是否可以像在函数式语言中那样完成。
对于那些好奇的人,这一切都在 ESP32 上运行,这是一种功能更强大但类似于 Arduino 附带的处理器。
【问题讨论】:
-
欺骗;不过,如果你真的下定决心,它确实有可能以特定于实现的方式破解它。
-
问题标题似乎与正文不匹配(标题听起来像标记的重复,但正文似乎在问一些不同的问题)。
-
您可以使用中间结构来解决函数缺乏类型自引用(或类似的东西;-))的问题。很遗憾他们关闭了你的 Q,因为对所谓的欺骗的答案看起来不太好。一个例子(传递给
indent):#include <stdio.h> struct fun { struct fun (*fun)(int); }; struct fun fun(int x){ struct fun r = {fun}; printf("%d\n", x); return r; } int main(void){ fun(45).fun(32).fun(78); } -
请改写您问题的标题,因为您不想从问题的正文中返回函数的地址。那么问题很可能会被重新提出。
-
void 函数不返回任何内容。
标签: c function-pointers