这个有效的标准c?

这个有效的标准c?

问题描述:

我检讨了一些优化库和整个函数签名这个有效的标准c?

double solvopt(unsigned short n, 
      double x[], 
      double fun(), 
      void grad(), 
      double options[], 
      double func(), 
      void gradc() 
     ) 

注意,乐趣()和加尔()作为函数传递出来。我的问题是如果这是有效的标准C语法。

谢谢。

采用double fun(),而不是double (*fun)()是一个古老的形式, 那是在标准C,从来没有在C++中, 如果我没有记错,声明函数的参数只有当才有效。 (很像ary[]这是合法的函数参数,而不是未初始化的变量)

因为它是不可能的(在C)按值传递函数到另一个函数,编译器只是把double fun()意思一个指向返回double的函数的指针。

因此,这是有效的(但 过时了。 已经失宠)

+6

不是关于C++的。这个表格在标准C和标准C++中都是完全有效的。这绝对没有什么古怪的。参数声明中的函数类型衰减到ponter类型的方式与参数声明中的数组类型完全相同,从而衰减为指针类型。两者在C和C++中的工作方式完全相同(除了本例中的()参数列表的含义外)。 – AnT 2010-02-17 21:35:58

+0

@AndreyT:奇然后,你从来没有看到使用这种形式,但我会改变答案 – 2010-02-17 21:46:35

+0

'[]数组'使用初始化列表时是合法的一个变量。 'int数组[] = {2,3,5,7,11,13};' – wallyk 2010-02-17 21:52:19

您的数组参数(x和选项)应该可能是指针。

引用带括号的函数,如“func()”或“gradc()”调用该函数。该函数的名称本身就是一个代码指针,可以通过取消引用来调用相关函数。

如果有疑问,请尝试使用ANSI C编译器进行编译 - 许多编译器提供了一个ANSI兼容性开关来执行标准符合性。另外,K&R book是你的朋友。

这是一个功课题吗?

+0

它们可以被认为是这样,但在这个声明'双X []'和'双* x'是等价的。 – 2010-02-17 21:23:09

+0

不,先生,那不是一个家庭作业问题。我甚至不是一个c程序员,但被要求查看一些c代码。 – leon 2010-02-17 21:25:40

func()gradc()对于参数未知的函数是正确的形式。我很确定,即使对于大约1975年的Unix 6,这也是一种可接受的语法。

[]参数与现在和过去的*相同。事实上,我记得20世纪80年代争议这是更恰当:

int main (int argc, char **argv, char **envp) 

int main (int argc, char *argv[], char *envp[]) 

有实际上是没有什么不同。根据语义,争议是更正确的。

+1

我总是不希望在函数参数中使用'[]'。 '* argv []'在视觉上比'** argv'更容易混淆,如果你使用括号,新的C程序员很容易认为变量实际上是一个数组而不是指针,并且尝试了一些'sizeof(x)/sizeof(x [0])''类型的操作。最好(恕我直言)使它完全清楚,它不是一个数组,不应该被视为一个。 – 2010-02-17 21:32:05

+2

我一直在倡导** argv的少数派。我很高兴找到另一个兄弟。 – wallyk 2010-02-17 21:50:43