我怎样才能理解这个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
和一个指向函数的指针,该函数接受double
和double[]
并返回一个double
:
double(*)(double,double[]))
并且bar返回一个指向另一个函数的指针,该函数接受一个double
并返回一个double
double(*)(double)