double (*bar(int, double(*)(double,double[])))(double);
在回顾演讲幻灯片时,我发现了一个留给学生的练习:
用简单的英语,这个C声明中
bar
的类型是什么?
请帮助指导我完成此操作。我甚至不知道从哪里开始,除了最终会有一些东西返回。
答案 0 :(得分:10)
如果您不确定是否可以像以下那样始终使用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)
答案 1 :(得分:7)
通过使用Spiral Rule的能力,您可以得到这个答案。能够通过从未知元素开始并阅读它来理解复杂的表达式(首先解决括号中的事物)。阅读代码时非常有用的技巧。
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网站;但即使你无法上网也能阅读代码。