【问题标题】:Is this valid standard c?这是有效的标准c吗?
【发布时间】:2010-02-17 21:15:20
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: c function visual-c++


    【解决方案1】:

    double fun() 而不是double (*fun)() 的使用是一种古老的形式,仅在标准 C 中有效,而在 C++ 中从未有效, 如果我没记错的话,仅在声明函数参数时. (很像ary[],它对于函数参数是合法的,但对于未初始化的变量是不合法的)

    由于不可能(在 C 中)将函数按值传递给另一个函数,因此编译器只使用 double fun() 来表示指向返回双精度值的函数的指针。

    所以这是有效的(但 archaic. 已经失宠)

    【讨论】:

    • C++ 不正确。该表单在标准 C 和标准 C++ 中都完全有效。绝对没有什么过时的。参数声明中的函数类型衰减为指针类型,其方式与参数声明中的数组类型衰减为指针类型完全相同。两者在 C 和 C++ 中的工作方式完全相同(除了 () 参数列表的含义,这在本例中无关紧要)。
    • @AndreyT:奇怪的是你从来没有见过这种形式,但我会改变答案
    • array[] 在使用初始化列表时对于变量是合法的。 int array[] = {2, 3, 5, 7, 11, 13};
    • 它在 C99 标准中 (open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf) 第 6.7.5.3 节函数声明符(包括原型)约束 8
    • @wallyk: array[] 在 C 和 C++ 中的任何非定义声明中都是合法的。唯一的区别是 size-less 数组类型是 incomplete.
    【解决方案2】:

    func()gradc() 是具有未知参数的函数的正确格式。我很确定即使对于 1975 年左右的 Unix 6 来说,这也是一种可接受的语法。

    [] 参数现在和过去都与* 相同。事实上,我记得 1980 年代关于哪个更合适的争论:

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

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

    在效果上没有什么不同。争论是根据语义哪个更正确。

    【讨论】:

    • 我一直不喜欢在函数参数中使用[]*argv[]**argv 在视觉上更令人困惑,如果你使用括号,新的 C 程序员可能会认为变量实际上是一个数组而不是一个指针,并尝试对它进行一些邪恶的 sizeof(x) / sizeof(x[0]) 类型的操作。最好(恕我直言)清楚地表明它不是一个数组,不应该被视为一个数组。
    • 我一直是少数提倡**argv。我很高兴找到另一个兄弟。
    【解决方案3】:

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

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

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

    这是一道作业题吗?

    【讨论】:

    • 可以这样想,但在这个声明中double x[]double *x 是等价的。
    • 不,先生,这不是作业问题。我什至不是 c 程序员,但被要求查看一些 c 代码。
    猜你喜欢
    • 2011-05-22
    • 2010-12-19
    • 1970-01-01
    • 2021-12-04
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多