具有未指定签名的C指针

时间:2018-08-23 17:41:12

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

我打算以阶乘为例来说明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);

不起作用)。

1 个答案:

答案 0 :(得分:0)

它不是很漂亮,但是如果将其包装在结构中,则可以具有完全指定的类型。

#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宏中的struct文字是C99的功能。在C89中,它甚至更难看。)