如何在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

+2

对于这个工作,你必须做一个递归类型的别名(在'f_p '类别别名需要引用它自己),这是不可能的。所以总之不能用标准C来完成。 –

+0

你为什么要问?详细了解[关闭](http://en.wikipedia.org/wiki/Closure_%28computer_programming%29)。使用[GCC](http://gcc.gnu.org/),你可能会有一个宏'DO',它扩展到一些聪明的[语句表达式](https://gcc.gnu.org/onlinedocs/gcc/Statement -Exprs.html) –

你的部分解决方案是不是标准的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); 
}