代码之家  ›  专栏  ›  技术社区  ›  tuket

typedef函数指针递归

c c++
  •  4
  • tuket  · 技术社区  · 7 年前

    我试图声明一个函数,该函数采用与参数类型相同的函数。

    void rec(void(*f)(void(*)(void(*)(...))))
    {
        f(f);
    }
    

    我最后做了一次递归尝试。

    你总是可以从一个 void* .

    void rec(void* f)
    {
        ((void(*)())f)(f);
    }
    

    但它不是类型安全的

    我试图用一个 typedef :

    typedef void(*RecFunc)(RecFunc);
    

    但不编译。

    有可能吗?

    2 回复  |  直到 7 年前
        1
  •  5
  •   dbush    7 年前

    不能以一致的方式直接执行此操作,但如果将函数指针放入包装器结构中,则可以:

    struct F;
    typedef void(*RecFunc)(struct F *);
    
    struct F {
        RecFunc f;
    };
    

    我们首先向前声明结构,以便typedef可以使用它。然后定义包含函数指针的结构。在这种情况下,resurve函数类型被定义为指向 struct F ,但如果它以 结构F .

    然后你可以这样使用它:

    void f(struct F *sf)
    {
        static int x=5;
    
        if (x) {
            printf("x=%d\n",x);
            x--;
            sf->f(&(struct F){f});
        }
    }
    
    int main()
    {
        f(&(struct F){f});
        return 0;
    }
    

    输出:

    x=5
    x=4
    x=3
    x=2
    x=1
    
        2
  •  5
  •   R Sahu    7 年前

    你不能做你想做的事。正如你所注意到的,你最终尝试了递归 typedef .该语言不支持这一点。