功能让它自我回归

时间:2018-02-12 15:13:06

标签: c

typedef logs_t(*logs_t)(char *);

logs_t logs(char *s) {
    printf("%s", s);
    fflush(0);
    return &logs;
}

错误:

log.c:1:17: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
typedef logs_t(*logs_t)(char *);
                ^
log.c:1:9: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
typedef logs_t(*logs_t)(char *);
~~~~~~~ ^
log.c:1:15: fatal error: function cannot return function type 'int (char *)'
typedef logs_t(*logs_t)(char *);
              ^
2 warnings and 1 error generated.

我想在这里实现的是将呼叫链接到logs

logs("a")("b");

2 个答案:

答案 0 :(得分:4)

你不能在C中做这样的递归类型定义。但是相互递归是可能的 - 你可以通过返回一个struct来链接,该#include <stdio.h> struct foo { struct foo (*logs)(char *); }; struct foo logs(char *arg) { puts(arg); return (struct foo){ logs }; } int main() { logs("foo").logs("bar"); } 将包含作为成员的函数的指针:

foo

但是,这在你的案例中几乎没用;也不是在任何其他一般情况下,因为this没有传递给.,所以你最后输入;而不是source

我看到它只在函数不会总是返回自身的情况下才有用;)

也许您想要使用变量参数

答案 1 :(得分:2)

这不会给你任意链接,但假设你是手动编写代码而不是自动生成的代码,因此可能不会将调用超出某个点,你可以做类似的事情:

#include <stdio.h>

typedef void (*ftype10)(char *s);
typedef ftype10 (*ftype9)(char *s);
typedef ftype9 (*ftype8)(char *s);
typedef ftype8 (*ftype7)(char *s);
typedef ftype7 (*ftype6)(char *s);
typedef ftype6 (*ftype5)(char *s);
typedef ftype5 (*ftype4)(char *s);
typedef ftype4 (*ftype3)(char *s);
typedef ftype3 (*ftype2)(char *s);
typedef ftype2 (*ftype1)(char *s);
typedef ftype1 (*ftype)(char *s);

ftype logs(char *s) {
    printf("%s\n", s);
    fflush(0);
    return (ftype)&logs;
}

int main() {
    logs("line1")("line2")("line3");
    return 0;
}