C 中函数 typedef 的前向声明

Tri*_*ase 4 c

我一直怀疑以前有人问过这个问题,但我没有找到......

假设我有一个函数 A 的 typedef,它接受一个指向带有 typedef B 的函数的指针,后者又接受一个 typedef A 的函数。如果其中一个是结构,我知道我将如何处理前向声明,但对于函数我不知道语法。有吗?

我希望能够做到:

typedef void (*function_A_t)(function_B_t f_B);
typedef void (*function_B_t)(function_A_t f_A);
Run Code Online (Sandbox Code Playgroud)

任何提示?更好的是,参考?顺便说一句,这实际上只是发生在我身上,但我能够以另一种方式修复它,尽管这实际上会更顺畅(更好的解耦,下一个人搞砸的机会更少),如果可能的话。

dbu*_*ush 6

您可以利用以下事实来做到这一点:C 指定没有参数的函数声明意味着它需要不确定数量的参数。

所以你可以这样做:

typedef void (*function_A_t)(void (*)());
typedef void (*function_B_t)(function_A_t f_A);
Run Code Online (Sandbox Code Playgroud)

这允许以下编译:

void A(function_B_t b)
{
    b(A);
}

void B(function_A_t a)
{
    a(B);
}

int main()
{
    function_A_t a = A;
    function_B_t b = B;
    a(B);
    b(A);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

C 标准的第 6.7.6.3p15 节陈述了以下关于函数类型兼容性的内容:

对于要兼容的两个函数类型,都应指定兼容的返回类型。此外,参数类型列表(如果两者都存在)应在参数数量和省略号终止符的使用方面达成一致;相应的参数应具有兼容的类型。 如果一种类型具有参数类型列表,而另一种类型由不属于函数定义的一部分且包含空标识符列表的函数声明符指定,则参数列表不应有省略号终止符,并且每个参数的类型应与应用默认参数提升所产生的类型兼容。 如果一种类型具有参数类型列表,而另一种类型由包含(可能为空)标识符列表的函数定义指定,则两者应在参数数量上一致,并且每个原型参数的类型应与类型兼容这是由于将默认参数提升应用于相应标识符的类型而产生的。(在确定类型兼容性和复合类型时,以函数或数组类型声明的每个参数视为具有调整类型,每个以限定类型声明的参数视为具有其声明类型的非限定版本。)

上面粗体部分表示void (*)()兼容void (*)(function_B_t)

  • @Basya 上面的标准引用来自 C11,但它适用于 C89 及更高版本。是的,这将允许任何具有“void”返回类型作为参数的函数指针。这并不理想,但却是我们能做到的最好的。 (2认同)