在C中,函数可以返回指向自身的指针吗?

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 附带的处理器。

Ard*_*der 5

是的,在 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)

输出:

该函数返回一个指向自身的指针

该函数返回一个指向自身的指针

编辑:

在阅读了问题的第二部分(其中提到了您对此的需要)之后,我认为您可能正在寻找recursioncallback。如果是这样,那么您可以在评论中澄清它,我将相应地编辑我的答案。