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");
答案 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;
}