我正在审查一些优化库并遇到了函数签名
double solvopt(unsigned short n,
double x[],
double fun(),
void grad(),
double options[],
double func(),
void gradc()
)
请注意,fun()和gard()作为函数传递。我的问题是,这是否是有效的标准C语法。
感谢。
答案 0 :(得分:7)
使用double fun()
而不是double (*fun)()
是一种古老的形式,仅在标准C中有效,从不在C ++中有效,如果我没记错,只有在声明一个函数参数。 (很像ary[]
,它对于函数参数是合法的,但对于未初始化的变量则不合适)
由于无法(在C中)通过值将函数传递给另一个函数,编译器只是将double fun()
表示指向返回double的函数的指针。
所以这是有效的(但是过时。已经失宠了)
答案 1 :(得分:2)
func()
和gradc()
的格式正确。我很确定这是一个可接受的语法,即使对于大约1975年的Unix 6也是如此。
现在和过去,[]
参数与*
相同。事实上,我记得20世纪80年代的争议更合适:
int main (int argc, char **argv, char **envp)
或
int main (int argc, char *argv[], char *envp[])
效果没有区别。根据语义,争议更为正确。
答案 2 :(得分:1)
您的数组参数(x和选项)可能应该是指针。
引用带括号的函数,如“func()”或“gradc()”调用函数。单独的函数名称是一个代码指针,可以解除引用以调用有问题的函数。
如有疑问,请尝试使用ANSI C编译器进行编译 - 许多编译器都提供ANSI兼容性开关来强制执行标准。此外,K&R book是您的朋友。
这是一个家庭作业问题吗?