这个复杂的声明的含义

时间:2013-10-19 00:29:56

标签: c++ function pointers return

考虑以下声明:

double(*foo(double (*)(double, double[]), double)) (double, ...)  
  • 用英语描述foo的类型。

这是一个家庭作业问题。我的分析是:

"foo is a function pointer to a function that has as it's first argument, 
another function pointer to a function that returns a double and takes a 
double and an array of doubles."  

是不是?任何人都可以用英语简化并指定正确/准确的表示吗?提前谢谢!

2 个答案:

答案 0 :(得分:5)

应用spiral rule,记住要去正确,左,右,左等,在退出之前总是做括号中的任何内容:

double(*foo(double (*)(double, double[]), double)) (double, ...)  
        ^^^

foo是......

double(*foo(double (*)(double, double[]), double)) (double, ...)  
           ^------------------------------------^

foo是一个函数......

double(*foo(double (*)(double, double[]), double)) (double, ...)  
                    ^

foo是一个指向...的指针的函数。

double(*foo(double (*)(double, double[]), double)) (double, ...)  
                      ^----------------^

foo是一个带函数指针的函数......

double(*foo(double (*)(double, double[]), double)) (double, ...)  
                       ^^^^^^^^^^^^^^^^

foo是一个函数,它指向一个带double的函数的指针和一个指向double的指针(如果你想对它进行糖衣,则为“双数组”)。 ..

double(*foo(double (*)(double, double[]), double)) (double, ...)  
            ^^^^^^                        ^^^^^^

foo是一个函数,它带有(指向函数的指针double和指向double的指针,返回double)和{{1} } ...

double

double(*foo(double (*)(double, double[]), double)) (double, ...) ^ 是一个函数,它带有(指向函数的指针foo和指向double的指针,返回double)和{{1}返回指向...的指针

double

double是一个函数,它带有(指向函数的指针double(*foo(double (*)(double, double[]), double)) (double, ...) ^-----------^ 和指向foo的指针,返回double)和{{1}返回指向函数的指针...

double

double是一个函数,它带有(指向函数的指针double和指向double(*foo(double (*)(double, double[]), double)) (double, ...) ^^^^^^^^^^^ 的指针,返回foo)和{{1}返回一个指向函数的指针,该函数采用double和任何...

double

double是一个函数,它带有(指向函数的指针double和指向double的指针,返回double(*foo(double (*)(double, double[]), double)) (double, ...) ^^^^^^ )和{{1}返回指向函数的指针,该函数采用foo以及返回double的任何内容。

将整个事物插入cdecl给了我这个(除了它不喜欢省略号参数):

  

声明foo为函数(指向函数的指针(double,double of array)返回double,double)返回指向函数的指针(double,...)返回double

答案 1 :(得分:1)

请这样看:

  double(*foo(double (*)(double, double[]), double)) (double, ...);
  == double(*foo(FUNC_PTR, double)) (double, ...)
  where FUNC_PTR is of the form => double(*)(double first_arg, double[] second_arg)