代码之家  ›  专栏  ›  技术社区  ›  Jordan Bonecutter

C中函数类型的前向声明

  •  2
  • Jordan Bonecutter  · 技术社区  · 2 年前

    我想在C中声明一个递归函数类型(一个声明自己的函数)。

    用Go这样的语言,我可以做到:

    type F func() F
    
    func foo() F {
      return foo
    }
    

    如果我尝试在C中执行等效操作:

    typedef (*F)(F());
    

    我从GCC中得到以下错误:

    main.c:1:14: error: unknown type name ‘F’
        1 | typedef (*F)(F());
    

    这是有道理的,因为F在使用时并不存在。正向声明可以解决这个问题,如何在C中正向声明函数类型?

    2 回复  |  直到 2 年前
        1
  •  2
  •   ikegami Gilles Quénot    2 年前

    C不支持递归类型定义。

    异常:您可以使用指向尚未声明的结构类型的指针,因此结构类型可以包括指向所声明结构类型的结构的指针。

    此外,您显然可以使用尚未声明的结构类型作为函数的返回值。因此,这接近于您想要的:

    // This effectively gives us
    // typedef struct { F *f } F( void );
    
    typedef struct S S;
    
    typedef S F( void );
    
    struct S {
       F *f;
    };
    
    S foo() {
       return (S){ foo };
    }
    
    int main( void ) {
       F *f = foo;
       printf( "%p\n", (void*)f );
    
       f = f().f;
       printf( "%p\n", (void*)f );
    }