'连续通话'意味着像这样的函数调用(我没有更好的词):
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
答案 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);
}