【问题标题】:C pointer to function with unspecifiable signature指向具有不可指定签名的函数的 C 指针
【发布时间】:2018-08-23 17:41:11
【问题描述】:

我打算以阶乘为例来解释 C 中递归定理的标准证明。所以我有

#include <stdio.h>

typedef unsigned Nat;
typedef Nat Func();

Nat G(Nat n, Func f){
    if(n) return n * f(n-1, f);
    else return 1;
}

int main(void){
    printf("%u", G(5, G));
    return 0;
}

它在我能找到的每个编译器上都有效(打印 120),但困扰我的是我将一个指向函数的指针传递给一个没有完全指定类型的参数(它是一个返回的函数Nat,但未指定参数类型)。按照标准可以吗(任何标准,但最好是不弃用未指定参数类型的标准,所以我猜是 C89:)?

当然,我更希望能够完全指定 Func,但这似乎是不可能的(很明显,

typedef Nat Func(Nat, Func);

不起作用)。

【问题讨论】:

    标签: function-pointers function-prototypes ansi-c


    【解决方案1】:

    它没有那么漂亮,但是如果你将它包装在一个结构中,你可以拥有一个完全指定的类型。

    #include <stdio.h>
    
    typedef unsigned Nat;
    typedef struct wrapped_Func Func;
    struct wrapped_Func {
      Nat (*call)(Nat, Func);
    };
    #define FUNC(f) ((struct wrapped_Func){.call=f})
    
    static Nat G(Nat n, Func f){
        if(n) return n * f.call(n-1, f);
        else return 1;
    }
    
    int main(void){
        printf("%u\n", G(5, FUNC(G)));
        return 0;
    }
    

    FUNC 宏中的结构字面量是 C99 的特性。在 C89 中它会更丑。)

    【讨论】:

    • 是的,如果我将它“包装”在void* 中,我可以做任何我想做的事情。 :-) 不要误会我的意思,您的解决方案令人敬畏,但我真的很想将 G 本身作为参数传递给 G(因为它是主要思想:),而不是它的一些预处理版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多