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

在像围棋这样的语言中,我可以做到:

type F func() F

func foo() F {
  return foo
}

如果我try 在C:中执行相同的操作

typedef (*F)(F());

我从GCC那里得到了以下错误:

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

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

推荐答案

C不支持递归类型定义.

异常:您可以使用指向尚未声明的 struct 类型的指针,因此 struct 类型可以包括指向正在声明的 struct 类型的 struct 的指针.

此外,显然可以使用尚未声明为函数返回值的 struct 类型.所以这接近于你想要的:

// 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 );
}

C++相关问答推荐

字符串令牌化xpath表达式

如何在C中通过套接字自定义数据类型读取原始变量?

LibpCap禁用监视器模式(C、MacOS)

为什么我一直收到分段错误?

Ruby C Api处理异常

struct -未知大小

如何在GDB中查看MUSL的源代码

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

仅从限制指针参数声明推断非混叠

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

STM32 FATFS用户手册(Um1721)中的代码正确吗?

发送和接收的消息中的Unix域套接字不匹配

区分MySQL C界面中的文本和BLOB字段

生成的头文件不包括用户定义的文件

为什么argc和argv即使在主函数之外也能工作?

如何不断地用C读取文件?

struct 中的qsort,但排序后的 struct 很乱

cs50拼写器分配中的无限循环