【问题标题】:Function return it self [duplicate]函数返回它自己[重复]
【发布时间】:2018-02-12 15:13:06
【问题描述】:
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");

【问题讨论】:

  • 嗯,简单地说 - 你不能。不过你可以返回struct...
  • @JulienLopez 这不是柯里化。柯里化是让一个函数修复另一个函数的参数。这里OP只想得到一个定点。
  • 对于任何类型T和函数T f(void);,表达式&f将是T (*)(void)类型,这与T不兼容,不管T 。您可以破解一些可能适用于一些严肃的铸造体操的东西,但它不允许像您的示例中那样进行链式函数调用。

标签: c


【解决方案1】:

你不能在 C 中做这样的递归类型定义。但是相互递归是可能的 - 你可以通过返回一个 struct 来链接,该 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 的形式传入,所以您最终只需输入. 而不是;

我认为它仅在函数不会总是返回自身的情况下才有用;)

也许您想改用变量参数

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2021-05-15
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      相关资源
      最近更新 更多