2010-11-23 70 views
2

老师们,我的教授给我们分配了一个涉及与数组,指针和函数打字的任务。现在,在你用全部的“我们不会为你做功课”的事情跳上前,我的问题的答案不会解决问题。事实上,我已经对答案做了最好的猜测。我只是好奇听到你对此的看法。这个C语句做了什么?

这里是C声明我得到:

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

我们的问题涉及描述foo的类型。我的问题仅仅是这个:这个陈述究竟做了什么?就我所能读的而言,这是我见过的代码中最混乱和不切实际的代码之一,或者它实际上并不是有效的C.让我知道你的想法。

+3

东西太可怕了,这就是它所宣称的。将它插入cdecl.org以获得它的含义(你可能需要删除`...`,因为cdecl恨他们。 – birryree 2010-11-23 03:08:54

+5

你的教授显然是个虐待者。 – ruslik 2010-11-23 03:13:13

+0

@ruslik,variadic是问题最少的部分:p – birryree 2010-11-23 03:14:15

回答

10

你想学的是Clockwise Spiral Rule。学习这将帮助你用简单的语言描述C中的任何类型。好好学习。

0

这将有助于一点

typedef RETURNTYPE (* POINTER_TO_FUNCTION_TYPE)(ARGTYPE1, ARGTYPE2) 

C支持一个类型,它是一个函数指针,你可以的typedef一个这样的方式来简化此基础上再表达。

所以,这种类型定义,我可以宣布这个功能

POINTER_TO_FUNCTION_TYPE f(POINTER_TO_FUNCTION_TYPE g); 

这是一个函数,函数指针,并返回一个指向功能。没有typedef,想象一下这个声明的外观。

0

根据我的编译器(Visual Studio 2010)该声明绝对没有什么。它编译成功,但没有为其生成汇编指令,因此调试器会立即执行。至于为什么它什么也不做,它的真正含义是什么 - 它需要一个有更多C知识的人来解释。

我可以使用顺时针/螺旋法则计算foo的类型,但是 - 谢谢jer!如果你重新格式化它会更容易:

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