如何在C语言中实现“连续调用”语法糖?
问题描述:
“连续拨打”是指一个函数调用这样的(我有没有更好的词):如何在C语言中实现“连续调用”语法糖?
foo(arg1,...)(arg2_1,...);
它等同于:
foo(arg1,...);
foo(arg2_1,...);
我认为我们可以返回一个指针谁是自己实施it.So这段代码运行良好:
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)
会返回一个“廉政”类型(尽管我们可以通过((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
答
你的部分解决方案是不是标准的conpliant,就证明了编译器警告。您需要显式强制转换以在指针类型之间进行转换。如果使用了强制转换,则会调用未定义的行为,因为在调用指针之前必须将指针转回原始类型。
不能在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);
}
对于这个工作,你必须做一个递归类型的别名(在'f_p '类别别名需要引用它自己),这是不可能的。所以总之不能用标准C来完成。 –
你为什么要问?详细了解[关闭](http://en.wikipedia.org/wiki/Closure_%28computer_programming%29)。使用[GCC](http://gcc.gnu.org/),你可能会有一个宏'DO',它扩展到一些聪明的[语句表达式](https://gcc.gnu.org/onlinedocs/gcc/Statement -Exprs.html) –