Joh*_*ler 3 c function-pointers
背景
因此,当您花费几年时间编写 Haskell 然后返回裸机 C 代码时,会发生以下情况:
问题
函数是否可以将与函数本身类型相同的指针作为其返回类型?是这样,语法是什么?
函数名称是否在函数体范围内?或者我可以获得当前正在执行的函数的地址?
例如
void foo() {
callmeback(&foo); // is this legal
}
Run Code Online (Sandbox Code Playgroud)
你为什么想做这个?
我有一个状态机,可以处理一些非常有限的控件的用户输入,这意味着两个输入操作必须服务于几种不同的模式。我正在将充满 switch 语句和全局变量的意大利面条代码重构为更易于维护的代码。如果我在 Haskell 中工作,我会使用用户输入调用当前模式函数,并让它返回一个函数以使用后续输入调用——无论是它本身还是新模式的处理程序。我开始用 C 语言执行此操作,并意识到我不知道如何编写处理函数的类型。如果这不起作用,我将简单地为下一个处理程序设置一个全局变量,然后继续生活,但我只需要问是否可以像在函数式语言中一样完成它。
对于那些好奇的人来说,这一切都在 ESP32 上运行,这是一种功能更强大的处理器,但类似于 Arduino 附带的处理器。
是的,在 C 中可以返回指向自身的函数指针。
您正在寻找的返回类型是void 指针 void*
是的,函数的名称在 C 语言的函数体内也是可见的。如果不是这种情况,递归之类的事情就不可能实现。
这是一些用于说明的代码:
#include <stdio.h>
void* demo() // See the usage of void pointer
{
printf("This function returns a pointer to itself");
return &demo;
// return demo is also fine
// don't return demo(), that would be recursion!
}
int main()
{
// Syntax
void (*demoPtr)() = demo();
// Test if it worked
demoPtr(); // There's no problem in ignoring the return value
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
该函数返回一个指向自身的指针
该函数返回一个指向自身的指针
编辑:
在阅读了问题的第二部分(其中提到了您对此的需要)之后,我认为您可能正在寻找recursion或callback。如果是这样,那么您可以在评论中澄清它,我将相应地编辑我的答案。