我怎样才能理解这个C类型声明?

double (*bar(int, double(*)(double,double[])))(double); 

在回顾演讲幻灯片时,我找到了一个留给学生的练习:

用简单的英语,这个C声明中的bar类型是什么?

帮我一步。 我甚至不知道从哪里开始,除了有些东西最终会返回双倍。

这个答案是通过使用螺旋规则的能力给你的。 能够通过从未知元素开始并阅读它来理解复杂的表达式(首先解决括号中的事物)。 阅读代码时非常有用的技巧。

  bar - bar bar() - is a function bar(int, ) - which takes an int... bar(int, (*)()) - and a function pointer bar(int, double(*)()) - which returns a double bar(int, double(*)(double, )) - and takes a double... bar(int, double(*)(double, double[])) - and an array of doubles (*bar(int, double(*)(double, double[]))) - and returns a pointer (*bar(int, double(*)(double, double[])))() - to a function (*bar(int, double(*)(double, double[])))(double) - taking a double double(*bar(int, double(*)(double, double[])))(double) - which returns a double 

这是一个艰难的方式…当然有网站使这更容易,例如cdecl网站; 但即使你无法访问互联网,能够阅读代码也是一件好事。

如果您不确定您是否可以使用K&R中描述的cdecl实用程序,如下所示:

 $ cdecl Type `help' or `?' for help cdecl> explain double (*bar(int, double(*)(double,double[])))(double); declare bar as function (int, pointer to function (double, array of double) returning double) returning pointer to function (double) returning double 

所以bar是一个函数,它接受一个int和一个指向函数的指针,该函数接受doubledouble[]并返回一个double

 double(*)(double,double[])) 

并且bar返回一个指向另一个函数的指针,该函数接受一个double并返回一个double

 double(*)(double)