这个有效的标准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的函数的指针。
因此,这是有效的(但
过时了。
已经失宠)
您的数组参数(x和选项)应该可能是指针。
引用带括号的函数,如“func()”或“gradc()”调用该函数。该函数的名称本身就是一个代码指针,可以通过取消引用来调用相关函数。
如果有疑问,请尝试使用ANSI C编译器进行编译 - 许多编译器提供了一个ANSI兼容性开关来执行标准符合性。另外,K&R book是你的朋友。
这是一个功课题吗?
它们可以被认为是这样,但在这个声明'双X []'和'双* x'是等价的。 – 2010-02-17 21:23:09
不,先生,那不是一个家庭作业问题。我甚至不是一个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[])
有实际上是没有什么不同。根据语义,争议是更正确的。
我总是不希望在函数参数中使用'[]'。 '* argv []'在视觉上比'** argv'更容易混淆,如果你使用括号,新的C程序员很容易认为变量实际上是一个数组而不是指针,并且尝试了一些'sizeof(x)/sizeof(x [0])''类型的操作。最好(恕我直言)使它完全清楚,它不是一个数组,不应该被视为一个。 – 2010-02-17 21:32:05
我一直在倡导** argv的少数派。我很高兴找到另一个兄弟。 – wallyk 2010-02-17 21:50:43
不是关于C++的。这个表格在标准C和标准C++中都是完全有效的。这绝对没有什么古怪的。参数声明中的函数类型衰减到ponter类型的方式与参数声明中的数组类型完全相同,从而衰减为指针类型。两者在C和C++中的工作方式完全相同(除了本例中的()参数列表的含义外)。 – AnT 2010-02-17 21:35:58
@AndreyT:奇然后,你从来没有看到使用这种形式,但我会改变答案 – 2010-02-17 21:46:35
'[]数组'使用初始化列表时是合法的一个变量。 'int数组[] = {2,3,5,7,11,13};' – wallyk 2010-02-17 21:52:19