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

tem*_*ame 5 c declaration

double (*bar(int, double(*)(double,double[])))(double);
Run Code Online (Sandbox Code Playgroud)

在回顾演讲幻灯片时,我发现了一个练习:

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

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

iab*_*der 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
Run Code Online (Sandbox Code Playgroud)

所以bar是一个函数,它接受一个带有int和的函数的指针double,double[]并返回一个double:

double(*)(double,double[]))
Run Code Online (Sandbox Code Playgroud)

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

double(*)(double)
Run Code Online (Sandbox Code Playgroud)

  • 它只是我,还是比cdecl的特定输出更容易阅读的原始代码?:-P (4认同)

Mik*_*ike 7

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

        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
Run Code Online (Sandbox Code Playgroud)

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