这是有效的标准吗?

时间:2010-02-17 21:15:21

标签: c function visual-c++

我正在审查一些优化库并遇到了函数签名

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

请注意,fun()和gard()作为函数传递。我的问题是,这是否是有效的标准C语法。

感谢。

3 个答案:

答案 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是您的朋友。

这是一个家庭作业问题吗?