如何实现一个'连续通话' C语言中的语法糖?

时间:2015-11-02 08:04:43

标签: c

'连续通话'意味着像这样的函数调用(我没有更好的词):

foo(arg1,...)(arg2_1,...);

相当于:

foo(arg1,...);
foo(arg2_1,...);

我认为我们可以返回一个指针,指示谁自己实现它。所以这段代码效果很好:

typedef int (*f_p)(); //*note* here I always must indicate a 'int' or any other type
f_p print_two_num ( int a , int b )
{
printf ("%d,%d\n", a, b);
return print_two_num;
}
//omit main()
print_two_num(1,2)(3,4);

但是我无法像以下一样调用此函数:

print_two_num(1,2)(3,4)(5,6);

因为print_two_num(1,2)(3,4)会返回' int'类型。(虽然我们可以通过((f_p)(print_two_num(4,5)(2,3)))(6,7))来调用它,但很难看。) 所以我们可以像这样更改代码:

typedef int (*f_p1)();
typedef f_p1 (*f_p2)();
f_p2 print_two_num ( int a , int b )
{
//...
return print_two_num;
}

但它不能像print_two_num(1,2)(3,4)(5,6)(7,8)一样调用,因为它在最后一次调用时仍然会出错。

现在,如何实现无限制的连续呼叫,我可以调用类似的函数:foo()()()()()... ...

我无法找到解决“递归定义”的好方法。问题

我知道这种语法糖没有实际帮助,我只是好奇:P

1 个答案:

答案 0 :(得分:3)

您的部分解决方案不符合标准,正如编译器警告所证明的那样。您需要显式转换才能在指针类型之间进行转换。如果使用强制转换,则调用未定义的行为,因为在调用之前必须将指针强制转换回原始类型。

您不能在C中使用这种确切的语法。

如果你真的想要,你可以这样做:

#include <stdio.h>

typedef struct chain (*f_p)(int, int);

struct chain
{
    f_p also;
};

struct chain print_two_num ( int a , int b )
{
    printf ("%d,%d\n", a, b);
    struct chain ret;
    ret.also = print_two_num;
    return ret;
}

int main ()
{
    print_two_num(1,2).also(3,4).also(5,6);
}